C# Autofac问题在解决实现同一接口的泛型类型时,需要解决()两次或更多次

C# Autofac问题在解决实现同一接口的泛型类型时,需要解决()两次或更多次,c#,generics,autofac,C#,Generics,Autofac,我在解决实现相同接口但具有不同类型约束的泛型类型时遇到了与Autofac相关的问题。也可能是我实现这个特定用例(下面将进一步描述)的方法是完全错误的,在这种情况下,我希望有人纠正我的想法 有关控制台应用程序示例,请参阅,并阅读下文以了解更多详细信息 我有两个接口 公共接口多租户 公共接口多租户 这些接口由一组类实现,这些类是IQueryable响应的通用类型。因此,我可以有响应类型为的请求,例如IQueryable或IQueryable,其中Game和Trophy实现上述两个多租户接口之一 现

我在解决实现相同接口但具有不同类型约束的泛型类型时遇到了与Autofac相关的问题。也可能是我实现这个特定用例(下面将进一步描述)的方法是完全错误的,在这种情况下,我希望有人纠正我的想法

有关控制台应用程序示例,请参阅,并阅读下文以了解更多详细信息

我有两个接口

公共接口多租户
公共接口多租户
这些接口由一组类实现,这些类是
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(服务 服务,IEnumerable
1配置工程师服务,类型
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、 IEnumerable
1 p)\r\n位于
Autofac.Core.Activators.DelegateActivator.ActivateInstance(IComponentContext
上下文,IEnumerable
1参数)\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,
IEnumerable
1参数)\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(IEnumerable
1 参数)\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
上下文,IEnumerable
1参数)\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,
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