5

私はDIの概念と構造マップが初めてです。AssemblyAすべてのインターフェースが にあり、すべての実装が にあるシナリオを完全に埋めようとしていますAssemblyBAssemblyBStructuremap を使用して、コンストラクターにインターフェイスに依存するクラスのインスタンスを挿入したいAssemblyA

public class Customer(ICustomerService)
{

}

ICustomerServiceは にAssemblyAあり、CustomerServiceクラスは にありassemblyBます。StructuremapCustomerServiceがこのコンストラクターにインスタンスを挿入するようにします。クラスの名前がインターフェイスの名前と同じ場合、接頭辞が and であると想定しています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

デフォルトの規則を使用して、各インターフェイスをクラスに登録することを避けたいと考えています。

4

1 に答える 1

1

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

このコードは動作するようです

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

ここでは、単純に x.IncludeNamespace("AssemblyA"); を追加しました。この名前空間が必要であると考えて AssemblyB をスキャンした後、動作を開始しました。

私の問題は解決しましたが、何が間違っていたのか、これが正しい方法なのかわかりません。どんな助けでも大歓迎です。

于 2013-01-04T11:44:57.030 に答える