2017-07-20 12 views
0

私のプロジェクトではAutofacを使用していますが、ほとんどの場合、正常に動作します。しばらく前に、私は、現在のユーザーへのアクセスを得るために必要とし、このようにラッパークラスを作成することでしたこれを行うための最善の方法を言われた:これは私のアプリケーションを介して問題なく働いているオートファック、ユーザーとログ

public class PrincipalProvider : IPrincipalProvider 
{ 
    public IPrincipal User => HttpContext.Current?.User; 
} 

。 私は次のようになり、新たなプロバイダがあります。

public class WmsProvider : IWmsProvider 
{ 
    private readonly Lazy<ILogProvider> _logProvider; 
    private readonly Lazy<IMessageProvider> _messageProvider; 

    private readonly CormarConfig _config; 
    private readonly ClaimsIdentity _identity; 

    public WmsProvider(IPrincipalProvider principalProvider, Lazy<ILogProvider> logProvider, Lazy<IMessageProvider> messageProvider) 
    { 
     _messageProvider = messageProvider; 
     _logProvider = logProvider; 

     _identity = (ClaimsIdentity)principalProvider.User.Identity; 
    } 

    /// <summary> 
    /// Sends the order to WMS 
    /// </summary> 
    /// <param name="model">The order model</param> 
    public async Task SendAsync(OrderViewModel model) 
    { 
     var request = WmsFactory.Create(model); 
     await _logProvider.Value.TraceAsync($"This is a test", _identity); 
     await _messageProvider.Value.CreateAsync(request, model.OrderNumber, MessageType.Wms, "ORD", Method.POST, null); 
    } 
} 

(私は簡潔にするためのコードの残りの部分を取り除かれている)

この場合は、ユーザーがnullで、エラーをスローします(オブジェクトインスタンスが見つかりません)。 しかし、私は同様のコンストラクタで別のクラスを持っている:

public OrderProvider(CormarConfig config, IOrderService orderSerivce, IPrincipalProvider principalProvider, Lazy<IAccountProvider> accountProvider, Lazy<ICollectionManagerProvider> collectionManagerProvider, Lazy<IEmailProvider> emailProvider, Lazy<IJournalProvider> journalProvider, Lazy<IOrderLineProvider> orderLineProvider, Lazy<IStockProvider> stockProvider, Lazy<webServices> webService, Lazy<ITroposOrderLineService> troposOrderLineService, Lazy<ITroposOrderService> troposOrderService, Lazy<ITroposUnitOfWork> troposUnitOfWork, Lazy<IWmsProvider> wmsProvider) 
    { 
     //Assign our config 
     _config = config; 

     // Add our services to our class 
     _connectionType = config.ConnectionType; 
     _orderService = orderSerivce; 

     // Add our providers to our class 
     _identity = (ClaimsIdentity)principalProvider.User.Identity; 

     // Add our optional providers 
     _accountProvider = accountProvider; 
     _collectionManagerProvider = collectionManagerProvider; 
     _emailProvider = emailProvider; 
     _journalProvider = journalProvider; 
     _orderLineProvider = orderLineProvider; 
     _stockProvider = stockProvider; 
     _webService = webService; 
     _wmsProvider = wmsProvider; 
     _troposOrderLineService = troposOrderLineService; 
     _troposOrderService = troposOrderService; 
     _troposUnitOfWork = troposUnitOfWork; 
    } 

そして、これが正常に動作します。 、

builder.RegisterType<OrderProvider>().As<IOrderProvider>().InstancePerRequest(); 
builder.RegisterType<WmsProvider>().As<IWmsProvider>().InstancePerRequest(); 

builder.RegisterType<PrincipalProvider>().As<IPrincipalProvider>(); 

ことの一つは、注意することは、それが直接コントローラに注入されていないので、WmsProviderは、OrderProviderに注入されていることである: の両方が私のモジュールで同じよ​​うに登録されています。コントローラーコンストラクターは次のようになります。

public OrdersController(IOrderProvider provider) 
{ 
    _provider = provider; 
} 

これは問題のある場所です。依存関係では、コンテキストは利用できませんか?それは解決策は何ですか?子供からの文脈に到達する方法はありますか?

ご協力いただければ幸いです。

+0

'この場合、ユーザーはnullであり、エラー(オブジェクトインスタンスが見つかりません)がスローされます。'どの行がその例外をスローしますか?その例外の種類は何ですか? – mjwills

答えて

0

私はこれを理解しました。

builder.RegisterType<PrincipalProvider>().As<IPrincipalProvider>().InstancePerRequest(); 

そして私はPrincipalProviderを変更:私が言ったように、それはコンテキストは私がリクエストごとのインスタンスにPrincipalProviderの登録を変更するので、これを修正するために、ネストされたクラスでは使用できませんでした、でしたこのように表示されます:

public class PrincipalProvider : IPrincipalProvider 
{ 

    // Readonly fields 
    private readonly HttpContext _current; 

    /// <summary> 
    /// Default constructor 
    /// </summary> 
    public PrincipalProvider() 
    { 
     _current = HttpContext.Current; 
    } 

    /// <summary> 
    /// Gets the current user 
    /// </summary> 
    public IPrincipal User => _current?.User; 
} 

これは私の問題を修正しました。

関連する問題