C# Autofac问题在解决实现同一接口的泛型类型时,需要解决()两次或更多次
我在解决实现相同接口但具有不同类型约束的泛型类型时遇到了与Autofac相关的问题。也可能是我实现这个特定用例(下面将进一步描述)的方法是完全错误的,在这种情况下,我希望有人纠正我的想法 有关控制台应用程序示例,请参阅,并阅读下文以了解更多详细信息 我有两个接口C# Autofac问题在解决实现同一接口的泛型类型时,需要解决()两次或更多次,c#,generics,autofac,C#,Generics,Autofac,我在解决实现相同接口但具有不同类型约束的泛型类型时遇到了与Autofac相关的问题。也可能是我实现这个特定用例(下面将进一步描述)的方法是完全错误的,在这种情况下,我希望有人纠正我的想法 有关控制台应用程序示例,请参阅,并阅读下文以了解更多详细信息 我有两个接口 公共接口多租户 公共接口多租户 这些接口由一组类实现,这些类是IQueryable响应的通用类型。因此,我可以有响应类型为的请求,例如IQueryable或IQueryable,其中Game和Trophy实现上述两个多租户接口之一 现
公共接口多租户
公共接口多租户
这些接口由一组类实现,这些类是IQueryable
响应的通用类型。因此,我可以有响应类型为的请求,例如IQueryable
或IQueryable
,其中Game
和Trophy
实现上述两个多租户接口之一
现在,我有两个非常相似的类定义
公共类MultiTenantHandler:IResponseHandler
响应:IQueryable
公共类MultitenantationalHandler:IResponseHandler
响应:IQueryable
公共接口IResponseHandler
这些类的实例由Autofac在单独的类中注入构造函数:
公共类中介管道:RequestHandler
TRequest在哪里:IRequest
{
公共调解管道(
i响应处理程序[]响应处理程序
)
}
Autofac的配置如下所示:
builder.RegisterGeneric(typeof(multi-tenanthandler))
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterGeneric(typeof(MultitenantationalHandler))
.AsImplementedInterfaces()
.SingleInstance();
我所期望的是,当MediatorPipeline
类截获返回类型为IQueryable
的响应时,multi-tenanthandler
类的一个实例将被注入responseHandler
变量。类似地,当中介管道
类截获返回类型为IQueryable
的响应时,MultitenantationalHandler
类的实例将被注入responseHandler
变量
如果这些注入类属于这两种特定的IQueryable
子类型,则它们会对我的响应进行后期处理
这一切都建立和工作。有点这都是WebAPI项目的一部分,问题是,当我第一次和第二次运行本应返回IQueryable
的端点时,我得到:
“消息”:“执行解析时引发异常
操作。有关详细信息,请参阅InnerException。-->
一般参数[1],“System.Linq.IQueryable'1[Game]”,on
“MultitenantationalHandler'2[TRequest,TreResponse]”违反了
类型为“TreResponse”的约束。(有关详细信息,请参阅内部异常。)“,
“类型”:“Autofac.Core.dependencResolutionException”
第一次执行在堆栈跟踪中有更深的层次:
“stacktrace”:“在
System.RuntimeType.ValidateGenericArguments(MemberInfo定义,
RuntimeType[]常规参数,异常e)\r\n位于
System.RuntimeType.MakeGenericType(类型[]实例化)\r\n位于
Autofac.Features.OpenGenerics.OpenGenericServiceBinder.TryBindServiceType(服务
服务,IEnumerable1配置工程师服务,类型
OpenGenericImplementType、Type和ConstructedImplementType,
IEnumerable
1&constructedServices)\r\n位于
Autofac.Features.OpenGenerics.OpenGenericRegistrationSource.d\u 0.MoveNext()\r\n
在
Autofac.Core.Registration.ComponentRegistry.GetInitializedServiceInfo(服务
服务)\r\n位于
Autofac.Core.Registration.ComponentRegistry.Registrationfor(服务
服务)\r\n位于
Autofac.Features.Collections.CollectionRegistrationSource.c__DisplayClass4.b__0(IComponentContext
c、 IEnumerable1 p)\r\n位于
Autofac.Core.Activators.DelegateActivator.ActivateInstance(IComponentContext
上下文,IEnumerable
1参数)\r\n位于
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1
参数)\r\n位于
Autofac.Core.Resolving.InstanceLookup.Execute()\r\n位于
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(iShareInLiFeTimeScope
当前操作范围,IComponentRegistration,
IEnumerable
1参数)\r\n位于
Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()\r\n
在
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext
上下文,IEnumerable1参数)\r\n位于
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable
1
参数)\r\n位于
Autofac.Core.Resolving.InstanceLookup.Execute()\r\n位于
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(iShareInLiFeTimeScope
当前操作范围,IComponentRegistration,
IEnumerable1参数)\r\n位于
Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()\r\n
在
Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext
上下文,IEnumerable
1参数)\r\n位于
Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable1
参数)\r\n位于
Autofac.Core.Resolving.InstanceLookup.Execute()\r\n位于
Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(iShareInLiFeTimeScope
当前操作范围,IComponentRegistration,
IEnumerable
1参数)\r\n位于
Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration
注册,IEnumerable`1参数)“
第二次执行时,在同一位置执行:
“stacktrace”:“在
System.RuntimeType.ValidateGenericArguments(MemberInfo定义,
RuntimeType[]常规参数,异常e)\r\n位于
System.RuntimeType.MakeGenericT
typeof(MultiTenantHandler<,>).IsCompatibleWithGenericParameterConstraints(new[] { typeof(IQueryable<Game>), typeof(IQueryable<Game>) }); // expected: true
typeof(MultiTenantHandler<,>).IsCompatibleWithGenericParameterConstraints(new[] { typeof(IQueryable<Trophy>), typeof(IQueryable<Trophy>) }); // expected: false
typeof(MultiTenantOptionalHandler<,>).IsCompatibleWithGenericParameterConstraints(new[] { typeof(IQueryable<Game>), typeof(IQueryable<Game>) }); // expected: false
typeof(MultiTenantOptionalHandler<,>).IsCompatibleWithGenericParameterConstraints(new[] { typeof(IQueryable<Trophy>), typeof(IQueryable<Trophy>) }); // expected: true
typeof(IQueryable<IMultitenant>).IsAssignableFrom(typeof(IQueryable<Game>)); // true
typeof(IQueryable<IMultitenant>).IsAssignableFrom(typeof(IQueryable<Trophy>)); // false
typeof(IQueryable<IMultitenantOptional>).IsAssignableFrom(typeof(IQueryable<Game>)); // false
typeof(IQueryable<IMultitenantOptional>).IsAssignableFrom(typeof(IQueryable<Trophy>)); // true