我在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中选择,所以最后我也有注册对象,只是无法激活它:
我认为解决方法是使用从IMarkerInterface&lt;&gt;派生的接口来标记类型,因此它们也都具有唯一的服务。另一个是解析IEnumerable&gt;,但这会解决所有的实现,而不仅仅是需要的实现(虽然这对性能的影响可以忽略不计,但它仍然是多余的)。但我不知道这是否是最好的解决方案,我觉得应该有一种更直接的方式。
非常感谢任何帮助!
解决方案
因为我还不能回答,这里: 只是模仿Autofac.ResolutionExtensions实现的实现,这个代码有效(我坦率地说不知道原因:构造函数params得到了正确填充;这应该意味着我误解了“参数”参数是什么)。
registration.Activator.ActivateInstance(_componentContext, Enumerable.Empty<Parameter>());
其中registration是IComponentRegistration实例,对应于我想要实例化的实现。 显然,这也需要用当前类型的参数“初始化”容器。致电
_componentContext.IsRegistered<IMarkerInterface<TypeParameter>>()
就够了。
感谢Sebastien Weber和kvalcanti的投入!
答案 0 :(得分:0)
如果你需要每个实现激活,我认为你也需要逐个注册。