1

SM repoに問題を投稿しました。

私の質問はこれに似ていますが、問題を特定したいと思います。

IPrinter<T>ジェネリック インターフェイスとそのジェネリック実装があるとしましょうPrinter<T>Printer<string>その際、StructureMap に具体的な閉じた型を解決してもらいたいですcontainer.GetInstance<IPrinter<string>>

明示的な登録はここで問題なく動作します:

container.Configure(r => r.For(typeof (IPrinter<>)).Use(typeof (Printer<>)));

しかし、スキャンは失敗します。解決しようとすると、StructureMap 例外が発生しRegisterConcreteTypesAgainstTheFirstInterface()ます。202 No Default Instance definedIPrinter<string>

明示的な構成なしで、必要な動作を実現する方法はありますか?

4

1 に答える 1

1

ConnectImplementationsToTypeClosing()は問題なく動作しますが、その仕組みを知っておく必要があります。Add()メソッドで型を登録しますが、これはUse()メソッドで行われる登録とは動作がまったく異なります。詳細な説明はこちらにあります。つまり、202 エラー コードが表示されても、要求されたプラグイン タイプの具体的なタイプが登録されていないという意味ではありません。それらを複数登録していて、デフォルトのインスタンスが指定されていない可能性があります。

お役に立てれば。

編集

これにより、「それらを複数登録し、デフォルトのインスタンスが指定されていない可能性があります」同じプラグインタイプの複数の実装が登録されたことを意味しました。

IPrinter<string>

あなたが定義した:

StringPrinter1 : IPrinter<string> and StringPrinter2 : IPrinter<string>

IPrinter<> には 1 つのタイプしか登録できないというわけではありません。

同じ汎用プラグイン タイプの複数の実装を登録する場合。

IPrinter<string>

次に、使用することをお勧めします:

var container = new Container(c => c.Scan(s => s.AddAllTypesOf(typeof(IHandler<>)).NameBy(t => t.Name)));

登録に名前を付けてから、明示的に名前で解決するには:

var stringPrinter1 = container.GetInstance<IPrinter<string>>("StringPrinter1");

またはそのような登録を使用して:

c.For<IMyTypeUsingPrinter>().Use<MyTypeUsingPrinter>().Ctor<IPrinter<string>>().Named("StringPrinter1");

これらの MyTypeUsingPrinterは StringPrinter1 を IPrinter< string > 依存関係として注入します。

于 2015-02-23T07:44:03.123 に答える