8

私は4つのプロジェクトを持っています依存性の注入とプロジェクト構造が

  • コア
  • のStructureMap

インフラストラクチャ(サービス):

  • コア
  • 外部依存

コンソール:

  • コア
  • DependencyResolver

Requierements:

私だけDependencyResolverでのStructureMapを使用しようとしています。 さらに、コンソールアプリケーションはInfrastuctureについて何も知ってはいけません。

コンソールアプリケーションでStructureMapを参照したくないときは、ServiceLocatorを構築する必要があります。 DependencyResolverで

私はインスタンスを取得したい私のコンソールアプリケーションでのStructureMapレジストリものを呼び出すための責任があるブートストラップ(登録)

を持っています。このために私はStructureMapを参照する必要があります。もう一つの方法は、StructureMapsの解決メソッドの周りに小さなラッパーを書くことです。

コンソールをStructureMapから切り離す他の方法はありますか?

+0

少し工夫されています。あなたのコードはどのように見えますか?依存関係リゾルバが構造マップをすでにカプセル化している場合、サービスロケータが必要なのはなぜですか? – SimonC

+0

http://bootstrapper.codeplex.com/ –

+0

名前依存関係リゾルバは、コンポーネントがどのような責任を負うかを考慮して最良の選択ではありません。現時点では、唯一の責任は依存関係を登録することです。ですから、私の質問は、依存性注入の解決の詳細です。 – Rookian

答えて

17

IoCレジスタを分離する理由がわかりましたが、アプリケーションの実装から解決すると、IoCコンテナがコンソールアプリケーション(コンポジションルート)と代わりに別のアセンブリでアプリケーションを実装します。

その方法は、コンソールアプリケーションは非常に簡単です:

  1. は用途に
  2. コールの実行の解決アプリケーションのコンテナ
  3. ロードコンテナ設定
  4. を作成し、
  5. に沿って、コンソールの引数を渡します
  6. アプリケーションが実行メソッドを終了するときにコンテナを破棄する
起動時に作成することはできませんもののため

public void Main(params string[] args) 
{ 
    using (var container = new Container()) 
    { 
     container.LoadAllConfigurationModules(); 
     container.AddRegistry<SomeRegistry>(); 
     container.GetInstance<Application>().Run(args); 
    } 
} 

、あなたのアプリケーションアセンブリの工場インターフェイスを作成します:

interface ISomeFactory { ISomeDependency CreateSomeDependency() } 

と、このインタフェースを実装し、それは次のように程度になりSMで

コンテナを注入してインスタンスを解決することによって、コンソールアプリケーションを作成します。

public class SomeFactory : ISomeFactory 
{ 
    public SomeFactory(IContainer sontainer) { this.container = container; } 
    ISomeDependency CreateSomeDependency() { this.container.GetInstance<ISomeDependency>(); } 
} 

他のIoCコンテナにも自動的にこれらのインタフェースファクトリを実装するfunctionallityを持っている:私は、SMの実装がこのように見えますね。

+0

あなたのソリューションでは、コンソールアプリケーション内のすべてのライブラリを参照する必要があります。コンポジションルートはMainクラスに直接存在するためです。 – Rookian

+6

はい、正しいです。しかし、どこに問題がありますか?このアセンブリはちょうど1つの目的を持っています - ブートストラップ! –

+0

ah ok。あなたの2番目の声明は重要です。それは理にかなっている。 – Rookian