2017-02-21 7 views
2

組み込みのIoCコンテナにアクセスしたいと考えています(IServiceProviderと思います)。.netコアのIServiceProvider/containerにアクセスする

私はコードでこれをアクセスすることは一般的に悪い習慣であり、フレームワークがコントローラのようなものに必要とされる依存関係を注入できるようにするべきだと私は知っています。

私の特定のアプリケーションは、別の製品Hangfireを使用しています。このフレームワークは、オブジェクト自体をインスタンス化します。これらのオブジェクトに依存関係を注入するには、JobActivatorクラスをオーバーライドし、そこで独自のコンテナを参照する必要があります。

This質問は、テストの目的で新しいコンテナを作成する方法を示していますが、私が既に設定したものにアクセスしたいし、それを複製する必要はありません。 AutofacのようなDIフレームワークでは、すべてのサービスを追加した後でコンテナにアクセスできます。

誰でも手助けできますか?

+0

Startup.csファイルで

public class AspNetCoreJobActivator : JobActivator { private IServiceProvider _serviceProvider; public AspNetCoreJobActivator(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public AspNetCoreJobActivator(IHttpContextAccessor httpContextAccessor) { _serviceProvider = httpContextAccessor.HttpContext.RequestServices; } public AspNetCoreJobActivator(HttpContext context) { _serviceProvider = context.RequestServices; } public override object ActivateJob(Type type) { return _serviceProvider.GetService(type); } } 

:カスタムJobActivatorは次のようになります。場合によっては、オブジェクトの作成を遅らせるか、ディスパッチする必要があります。これは、「コンテナ」にコールバックする必要があることを意味します。このコールバックが[Composition Root](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)内に実装されている限り、これは[絶対に良い](http://blog.ploeh.dk /2011/08/25/ServiceLocatorrolesvs.mechanics/)。 – Steven

答えて

0

コンフィギュレーションフェーズapp.ApplicationServicesまたはHttpContext.RequestServicesを使用してIServiceProviderにアクセスできます。あなたの場合は完全に有効である

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) 
{ 
    GlobalConfiguration.Configuration.UseActivator(new AspNetCoreJobActivator(serviceProvider)); // or app.ApplicationServices 
    var server = new Hangfire.BackgroundJobServer(); 

    app.UseMvcWithDefaultRoute(); 
} 
+0

ありがとうございます。これが私がサービスプロバイダーへのアクセスを得る方法です。私はHangfireとは別の問題を抱えていましたが、それは別の時間です! :) – Zak

関連する問題