Generics can StructureMap自动注册处理程序<;T>;对于IHandler<;T>;?

Generics can StructureMap自动注册处理程序<;T>;对于IHandler<;T>;?,generics,dependency-injection,ioc-container,structuremap,auto-registration,Generics,Dependency Injection,Ioc Container,Structuremap,Auto Registration,我在SM回购上发了帖子 我的问题与类似,但我想将问题本地化 假设我有通用接口IPrinter及其通用实现Printer。我希望StructureMap在执行container.GetInstance时解析具体的封闭类型Printer 在这里,显式注册可以正常工作: container.Configure(r=>r.For(typeof(IPrinter)).Use(typeof(Printer)) 但是扫描失败:RegisterConcreteTypesAgainstTheFirstInterf

我在SM回购上发了帖子

我的问题与类似,但我想将问题本地化

假设我有通用接口
IPrinter
及其通用实现
Printer
。我希望StructureMap在执行container.GetInstance时解析具体的封闭类型
Printer

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

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

但是扫描失败:
RegisterConcreteTypesAgainstTheFirstInterface()
在尝试解析
IPrinter
时,导致
202未定义默认实例
StructureMap异常

有没有一种方法可以在没有显式配置的情况下实现我想要的行为?

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

希望这有帮助

编辑

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

IPrinter<string>
IPrinter
您已定义:

StringPrinter1 : IPrinter<string> and StringPrinter2 : IPrinter<string>
StringPrinter1:IPrinter和StringPrinter2:IPrinter
并不是说只允许为IPrinter注册一种类型

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

IPrinter<string>
IPrinter
然后我建议使用:

var container = new Container(c => c.Scan(s => s.AddAllTypesOf(typeof(IHandler<>)).NameBy(t => t.Name)));
var container=newcontainer(c=>c.Scan(s=>s.AddAllTypesOf(typeof(IHandler)).NameBy(t=>t.Name));
要获得命名注册,然后显式按名称解析它们,请执行以下操作:

var stringPrinter1 = container.GetInstance<IPrinter<string>>("StringPrinter1");
var stringPrinter1=container.GetInstance(“stringPrinter1”);
或使用该等注册:

c.For<IMyTypeUsingPrinter>().Use<MyTypeUsingPrinter>().Ctor<IPrinter<string>>().Named("StringPrinter1");
c.For().Use().Ctor().Named(“StringPrinter1”);
他们使用MyTypeUsingPrinter将StringPrinter1作为IPrinter依赖项注入。

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

希望这有帮助

编辑

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

IPrinter<string>
IPrinter
您已定义:

StringPrinter1 : IPrinter<string> and StringPrinter2 : IPrinter<string>
StringPrinter1:IPrinter和StringPrinter2:IPrinter
并不是说只允许为IPrinter注册一种类型

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

IPrinter<string>
IPrinter
然后我建议使用:

var container = new Container(c => c.Scan(s => s.AddAllTypesOf(typeof(IHandler<>)).NameBy(t => t.Name)));
var container=newcontainer(c=>c.Scan(s=>s.AddAllTypesOf(typeof(IHandler)).NameBy(t=>t.Name));
要获得命名注册,然后显式按名称解析它们,请执行以下操作:

var stringPrinter1 = container.GetInstance<IPrinter<string>>("StringPrinter1");
var stringPrinter1=container.GetInstance(“stringPrinter1”);
或使用该等注册:

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

他们使用MyTypeUsingPrinter将StringPrinter1作为IPrinter依赖项注入。

谢谢!检查更新,我说得更清楚了
.For(typeof(IPrinter)).Use(typeof(Printer)
也可以,但我要寻找的是真正自动注册简单案例的方法。如果只有一种(通用),我认为这是一种简单的方法通用接口的实现。我知道显式的方法。我正在寻找的是自动的方法,我的意思是我只想写一行
registerConcreteTypesaginTheFirstInterface()
。我不想列出我应用程序中所有的通用类型来注册它们。好的,现在就知道了:)我不建议使用这种方法,但如果你真的需要它,你可以编写自定义约定来相应地注册类型。我不需要编写约定来自动处理非泛型类型,所以我想知道泛型类型的特殊之处。谢谢!检查更新,我说得更清楚了
.For(typeof(IPrinter)).Use(typeof(Printer)
也可以,但我要寻找的是真正自动注册简单案例的方法。如果只有一种(通用),我认为这是一种简单的方法通用接口的实现。我知道显式的方法。我正在寻找的是自动的方法,我的意思是我只想写一行
registerConcreteTypesaginTheFirstInterface()
。我不想列出我应用程序中所有的通用类型来注册它们。好的,现在就知道了:)我不建议使用这种方法,但如果你真的需要它,你可以编写自定义约定来相应地注册类型。我不需要编写约定来自动处理非泛型类型,所以我想知道泛型类型的特殊之处。