私のプロジェクトでは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;
}
これは問題のある場所です。依存関係では、コンテキストは利用できませんか?それは解決策は何ですか?子供からの文脈に到達する方法はありますか?
ご協力いただければ幸いです。
'この場合、ユーザーはnullであり、エラー(オブジェクトインスタンスが見つかりません)がスローされます。'どの行がその例外をスローしますか?その例外の種類は何ですか? – mjwills