Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Autofac中按类型名称(或id、IComponentRegistration…)解析_C#_Dependency Injection_Autofac - Fatal编程技术网

C# 在Autofac中按类型名称(或id、IComponentRegistration…)解析

C# 在Autofac中按类型名称(或id、IComponentRegistration…)解析,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我在Autofac中注册了多个泛型类型,所有这些类型都实现了泛型标记接口。基本上这是注册,我不能将其更改为,例如,命名: builder.RegisterGeneric(typeof(MyType1<>)).As(typeof(IMarkerInterface<>)); builder.RegisterGeneric(typeof(MyType2<>)).As(typeof(IMarkerInterface<>)); builder.Registe

我在Autofac中注册了多个泛型类型,所有这些类型都实现了泛型标记接口。基本上这是注册,我不能将其更改为,例如,命名:

builder.RegisterGeneric(typeof(MyType1<>)).As(typeof(IMarkerInterface<>));
builder.RegisterGeneric(typeof(MyType2<>)).As(typeof(IMarkerInterface<>));
builder.RegisterGeneric(typeof(MyType3<>)).As(typeof(IMarkerInterface<>));
其中builder是ContainerBuilder实例。 如果我只知道实现的类型名(例如MyAssembly.MyType2),是否有合适的方法解析注册为IMarkerInterface的类型? 注册可以通过LINQ查询从IComponentContext.ComponentRegistry.Registrations中选择,因此最终我也有了注册对象,只是无法激活它:

registration.Activator.ActivateInstance需要构造函数参数,但我不知道这些参数,尽管它们可以由Autofac在解决后注入 这里完全适合我,因为我有注册id和IComponentContext实例,但现在似乎v2.5.2.830已经不存在了。 由于该类型的服务类型是marker接口,我无法按服务类型解析,因为它将解析恰好位于顶部的一个实现。 我认为一种解决方法是使用从IMarkerInterface派生的接口来标记类型,这样它们也都有唯一的服务。另一种方法是解析IEnumerable>,但这将解析所有实现,而不仅仅是需要的实现。虽然这对性能的影响可以忽略不计,但仍然是多余的。但我不知道这是否是最好的解决方案,我觉得应该有一个更直接的方法

任何帮助都将不胜感激

解决方案

因为我还不能回答,这里: 只是模仿Autofac.ResolutionExtensions曾经的实现,这段代码可以工作,坦率地说,我不知道为什么:构造函数参数被正确填充;这意味着我误解了parameters参数是什么

registration.Activator.ActivateInstance(_componentContext, Enumerable.Empty<Parameter>());
其中registration是IComponentRegistration实例,对应于我想要实例化的实现。 显然,这还需要使用当前类型params初始化容器。打电话给

_componentContext.IsRegistered<IMarkerInterface<TypeParameter>>()
够了


感谢塞巴斯蒂安·韦伯和克瓦尔坎蒂的投入

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

您注册了一个开放的泛型,现在您想做。。。到底是什么?AutoFac将为您关闭类型定义,即如果请求IMarkerInterfac,它将为您提供MyType的实例。这种行为有什么问题?我已经澄清了这个问题;很抱歉,不清楚是否有多个实现实现了相同的标记接口,我想选择一个在运行时解决。我不是AutoFac方面的专家,但据我所知,上述方法永远不会奏效。您可以为同一个同样打开的泛型目标接口注册多个打开的泛型类型。当其他容器被要求提供任何封闭类型IMarkerInterface的实例时,它们将仅使用上次注册的MyType3。我认为AutoFac会做类似的事情。看起来AutoFac比这聪明得多,请参见解决方案:-.IComponentContext.ResolveComponent是替代您提到的IIRC的方法。但是,您的问题中似乎仍然缺少一些信息-何时关闭泛型类型?例如,在IMarkerInterface中指定Foo?我链接的方法基本上符合我的要求,因此可能有其他方法。。。我来看看它的实现。