在Autofac中按类型名称(或id,IComponentRegistration ...)解析

时间:2012-01-03 12:30:35

标签: c# dependency-injection autofac

我在Autofac注册了多个(通用)类型,所有类型都“实现”(通用)标记接口。基本上这是注册,我不能改变它(例如命名):

builder.RegisterGeneric(typeof(MyType1<>)).As(typeof(IMarkerInterface<>));
builder.RegisterGeneric(typeof(MyType2<>)).As(typeof(IMarkerInterface<>));
builder.RegisterGeneric(typeof(MyType3<>)).As(typeof(IMarkerInterface<>));

其中builder是ContainerBuilder实例。 是否有正确的方法来解析注册为IMarkerInterface的类型&lt;&gt;如果我只知道实现的(类型)名称(例如MyAssembly.MyType2)? 注册可以简单地从带有LINQ查询的IComponentContext.ComponentRegistry.Registrations中选择,所以最后我也有注册对象,只是无法激活它:

  • registration.Activator.ActivateInstance()需要构造函数参数,但我不知道这些(尽管如果已解决它们可以通过Autofac注入)
  • used to be a method完全适合我(因为我有注册ID和ICompontentContext实例),但似乎现在(v2.5.2.830)它已经消失了。
  • 由于类型的服务类型是标记接口,我无法通过服务类型解析,因为它将解决碰巧位于顶部的一个实现。

我认为解决方法是使用从IMarkerInterface&lt;&gt;派生的接口来标记类型,因此它们也都具有唯一的服务。另一个是解析IEnumerable&gt;,但这会解决所有的实现,而不仅仅是需要的实现(虽然这对性能的影响可以忽略不计,但它仍然是多余的)。但我不知道这是否是最好的解决方案,我觉得应该有一种更直接的方式。

非常感谢任何帮助!

解决方案

因为我还不能回答,这里: 只是模仿Autofac.ResolutionExtensions实现的实现,这个代码有效(我坦率地说不知道原因:构造函数params得到了正确填充;这应该意味着我误解了“参数”参数是什么)。

registration.Activator.ActivateInstance(_componentContext, Enumerable.Empty<Parameter>());

其中registration是IComponentRegistration实例,对应于我想要实例化的实现。 显然,这也需要用当前类型的参数“初始化”容器。致电

_componentContext.IsRegistered<IMarkerInterface<TypeParameter>>()

就够了。

感谢Sebastien Weber和kvalcanti的投入!

1 个答案:

答案 0 :(得分:0)

如果你需要每个实现激活,我认为你也需要逐个注册。