1

我在 SM repo 上发布了一个问题。

我的问题与类似,但我想本地化一个问题。

假设我有通用接口IPrinter<T>及其通用实现Printer<T>Printer<string>当我这样做时,我希望 StructureMap 能够解析具体的封闭类型container.GetInstance<IPrinter<string>>

显式注册在这里可以正常工作:

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

但是扫描的东西失败了:当我尝试解析时RegisterConcreteTypesAgainstTheFirstInterface()导致StructureMap 异常。202 No Default Instance definedIPrinter<string>

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

4

1 回答 1

1

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

希望这可以帮助。

编辑

这样说:“可能是您注册了多个并且没有指定默认实例”我的意思是注册了多个相同插件类型的实现,例如

IPrinter<string>

您已定义:

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

并不是说您只能为 IPrinter<> 注册一种类型。

当您想注册相同通用插件类型的多个实现时,例如

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 回答