2013-01-03 9 views
5

私はDIコンセプトを初めて使用し、構造マップを初めて使用しました。私はすべての私のインターフェイスがAssemblyAにあり、私のすべての実装がAssemblyBにあるシナリオをいっぱいにしようとしています。私はAssemblyAにあり、CustomerServiceクラスがassemblyBであるAssemblyAStructure Mapを使用した複数のアセンブリからの依存性注入

public class Customer(ICustomerService) 
{ 

} 

ICustomerServiceからインターフェイスへの依存関係を持つコンストラクタでAssemblyBクラスのインスタンスを注入するのStructureMapを使用したいです。私はこのコンストラクタにCustomerServiceインスタンスを挿入するためにStructuremapを欲しいです。私は、クラス名が接頭辞の接頭辞の名前と同じで、かつIであると仮定しています。 Structuremapはそれを自動的に認識します。

私は以下の構成を書いています。

x => 
     { 


      x.Scan(scan => 
       { 
        scan.Assembly("AssemblyA"); 
        scan.Assembly("AssemblyB"); 
        scan.TheCallingAssembly(); 
        scan.WithDefaultConventions(); 
      }); 

が、それは私にエラー

StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily AssemblyA.ICustomerService, AssemblyA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

を任意の助けが参考になります提供します。私は、デフォルトの規則を使い、各インタフェースをクラスに登録しないようにしたい。

ありがとうございました。

答えて

1

わかりました。うまくいきましたが、今はさらに混乱しています。

このコードは、私は、単純な追加x.IncludeNamespace( "AssemblyA")を持っている。ここ

IContainer container = new Container(c => 
      { 
       c.Scan(x => 
       { 
        x.Assembly("AssemblyA"); 
        x.Assembly("AssemblyB"); 
        x.IncludeNamespace("AssemblyA"); 
        x.TheCallingAssembly(); 
        x.WithDefaultConventions(); 
       }); 
      }); 

を動作するようです。 AssemblyBがこの名前空間を必要としていると思った後、作業を​​開始しました。

私の問題は解決しましたが、何が間違っているのか、これが正しい方法であるのか分かりません。どんな助けも依然として非常に高く評価されます。

+0

私は何が起こっていたのか理解できました。私は、スキャンしていたさまざまなアセンブリでInterfaceを実装していた複数のクラスを持っていました。これは、私が質問で報告した元のエラーを生成します。すべてのスキャンアセンブリでSMのデフォルト条約を満たすクラスが1つしかない場合、質問に投稿したコードは正しく動作するはずです。それ以前にそれに慣れていないのは悪いですが、誰かが彼の頭を叩くのを助けることを願っています x.IncludeNamespace( "AssemblyA")を追加するとすぐに、基本的に私はSMのクラスアセンブリをフィルタリングし、それは動作を開始:) –

関連する問題