MEF を DI に使用する方法について、よく調べてサンプルを探しました。私はそれがDIではないことを知っていますが、私が聞いたこと(ポッドキャストで実際に聞いたもの)からは、そのように使用できます...しかし、ブログの投稿やサンプルが見つかりません.
私はすでにこのプロジェクトで (プラグインをサポートするために) MEF を使用しており、DI にも活用するとよいと思いました。
多分私は間違った木を吠えていますか?
MEF を DI に使用する方法について、よく調べてサンプルを探しました。私はそれがDIではないことを知っていますが、私が聞いたこと(ポッドキャストで実際に聞いたもの)からは、そのように使用できます...しかし、ブログの投稿やサンプルが見つかりません.
私はすでにこのプロジェクトで (プラグインをサポートするために) MEF を使用しており、DI にも活用するとよいと思いました。
多分私は間違った木を吠えていますか?
これは例で説明できます。たとえば、すべての特注アプリケーションのベースとなるコア ライブラリがあるとします。MyCompany.Core と呼びます。通常、作成するすべてのアプリケーションには MyCompany.Core への参照が含まれている必要があります。次にアプリケーションは、適切なサービスなどを正しい順序で開始するために、ブートストラップと MyCompany.Core への呼び出しを処理する必要があります。これは、コア自体が起動方法などをよりよく知っている可能性があることを考えると、あまり意味がありません。
依存性注入に MEF を使用するには、コアで次のようにします。
[Import("/Application", typeof(IBespokeApplication))]
private IBespokeApplication bespokeApplication;
コア自体にはアプリケーションの起動コードが含まれており、すべてのサービスを起動すると、次のようなものを呼び出す可能性があります。
bespokeApplication.Start();
カスタム アプリケーションでは、自分自身をエクスポートする必要があります。
[Export("/Application", typeof(IBespokeApplication))]
public class MyApplication : IBespokeApplication
{
public void Start()
{
/* start app */
}
}
これで、カスタム アプリケーションに MyCompany.Core への直接参照を含めて、サービスを直接呼び出すことができます。また、サービスをエクスポートとして公開し、それらをアプリケーションにインポートすることもできます。たとえば、コアでは次のようになります。
[Export("/LoggingService", typeof(ILoggingService))]
public class NLogLoggingService : ILoggingService
{
/* ... */
}
次に、オーダーメイドのアプリケーションで:
[Import("/LoggingService", typeof(ILoggingService))]
private ILoggingService loggingService;
...そしてあなたがそれを使いたいとき:
loggingService.LogInformation("My Message");
文献からわかる限り、それが依存性注入の本質です。