可以使用StructureMap为IHandler <t>?</t> </t>自动注册Handler <t>

时间:2013-06-25 04:54:21

标签: generics dependency-injection ioc-container structuremap auto-registration

我在SM repo上发布了an issue

我的问题类似于this one,但我想将问题本地化。

假设我有通用接口IPrinter<T>及其通用实现Printer<T>。当我Printer<string>时,我希望StructureMap解析具体的封闭式container.GetInstance<IPrinter<string>>

显式注册工作正常:

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

但是当我尝试解析RegisterConcreteTypesAgainstTheFirstInterface()时,扫描内容失败:202 No Default Instance defined会导致IPrinter<string> StructureMap异常。

有没有办法在没有明确配置的情况下完成我想要的行为?

1 个答案:

答案 0 :(得分:1)

ConnectImplementationsToTypeClosing()工作得很好但你必须知道它是如何工作的。它使用 Add()方法注册类型,与使用 Use()方法完成的注册相比,它的行为完全不同。可以找到详细的解释here。简而言之,当您收到202错误代码并不意味着您没有为请求的插件类型注册任何具体类型。可能是您已经多次注册它们并且未指定默认实例。

希望这有帮助。

修改

通过这个:&#34;可能是你已经注册了多个并且没有指定默认实例&#34;我的意思是注册了相同插件类型的多个实现,例如对

IPrinter<string>

你定义了:

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

并非您只能为IPrinter注册一种类型&lt;&gt;。

如果要注册相同通用插件类型的多个实现,例如

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&lt;字符串&gt;依赖性。