我在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异常。
有没有办法在没有明确配置的情况下完成我想要的行为?
答案 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;依赖性。