2017-09-13 25 views
0

私はASP.NetコアWebアプリケーションを使用しており、Startup.csクラスの標準的な登録メソッドを使用してサービスを登録しています。ASP.NetコアDIコンテナからサービスを取得

IServiceCollection内の登録済みサービスにアクセスして、特定のサービスインスタンスを見つけるために反復処理する必要があります。

これはASP.Net Core DIコンテナでどうすればできますか?私はコントローラの外でこれを行う必要があります。

以下は私がしようとしているものの例です。 すべての方法は、それは私がを把握しようとしているものだ、ServiceCollection上に存在しないことに注意してください:

多くのトライアル終了エラーの後
public class EventContainer : IEventDispatcher 
{ 
    private readonly IServiceCollection _serviceCollection; 

    public EventContainer(IServiceCollection serviceCollection) 
    { 
     _serviceCollection = serviceCollection; 
    } 

    public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent 
    { 
     foreach (var handler in _serviceCollection.All<IDomainHandler<TEvent>>()) 
     { 
      handler.Handle(eventToDispatch); 
     } 
    } 
} 
+0

はそれが正しい、あなたのDIコンテナにそれを登録することでEventContainer' 'のコンストラクタで' IServiceCollection'を注入しようということですか? – larsbe

+2

あなたは本当にそれを手動で繰り返す必要があります - なぜあなたはIServiceProviderを使いたくありません:serviceProvider.GetService >()? –

+0

私のイベントハンドラには、いくつかの型が関連付けられている可能性があります。 EmailHandler、PushNotificationHandlerなど –

答えて

0

私は解決策に出くわしましたので、私は自分の答えを行う必要があります恥の問題。解決策は非常にシンプルでありながら、直感的ではないことが判明しました。キーはBuildServiceProvider()を呼び出すことですServiceCollectionにGetServices():。

public class EventContainer : IEventDispatcher 
{ 
    private readonly IServiceCollection _serviceCollection; 

    public EventContainer(IServiceCollection serviceCollection) 
    { 
     _serviceCollection = serviceCollection; 
    } 

    public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent 
    { 
     var services = _serviceCollection.BuildServiceProvider().GetServices<IDomainHandler<TEvent>>(); 

     foreach (var handler in services) 
     { 
      handler.Handle(eventToDispatch); 
     } 
    } 
} 
+1

btwのように、IServiceCollectionの代わりにIServiceProviderを直接注入することでこれをショートカットできます – Learner

関連する問題