LightInject 不解析继承的泛型类型
LightInject doesn't resolve inherited generic types
我正在尝试使用 LightInject 和 MediatR 构建通用请求处理程序。基本上,我有如下类型:
public class SomeType { }
public class InheritedType : SomeType { }
public class Handler : IAsyncRequestHandler<SomeType, SomeResponseType> { }
并且我已经将 Handler
类型注册到我的 LightInject 容器中,如下所示:
registry.RegisterAssembly(typeof(SomeType).Assembly, (s, type) =>
!s.IsClass && type.IsAssignableToGenericType(typeof(IAsyncRequestHandler<,>)
);
但是,当我尝试调用我的调解器以实施 IAsyncRequestHandler<InheritedType,SomeResponseType>
时,它失败了。我本来希望注册 Handler
因为 InheritedType
实现了 SomeType
.
我是不是做错了什么,或者在 LightInject 中有什么方法可以实现我上面描述的行为吗?
如果不清楚请告诉我,我可以尝试提供更多信息。谢谢!
Handler class 关闭两个通用参数并且以后无法更改。
只需尝试手动创建 Handler 的新实例 class,您会发现无法指定通用参数,因为它们已关闭。
将您的代码更改为此。
public class Handler<T, SomeResponseType> : IAsyncRequestHandler<T, SomeResponseType> where T:IAsyncRequest<SomeResponseType>
{
public Task<SomeResponseType> Handle(T message)
{
throw new NotImplementedException();
}
}
像这样注册和解决
var container = new ServiceContainer();
container.Register(typeof(IAsyncRequestHandler<,>), typeof(Handler<,>));
var instance = container.GetInstance<IAsyncRequestHandler<InheritedType, SomeResponseType>>();
我正在尝试使用 LightInject 和 MediatR 构建通用请求处理程序。基本上,我有如下类型:
public class SomeType { }
public class InheritedType : SomeType { }
public class Handler : IAsyncRequestHandler<SomeType, SomeResponseType> { }
并且我已经将 Handler
类型注册到我的 LightInject 容器中,如下所示:
registry.RegisterAssembly(typeof(SomeType).Assembly, (s, type) =>
!s.IsClass && type.IsAssignableToGenericType(typeof(IAsyncRequestHandler<,>)
);
但是,当我尝试调用我的调解器以实施 IAsyncRequestHandler<InheritedType,SomeResponseType>
时,它失败了。我本来希望注册 Handler
因为 InheritedType
实现了 SomeType
.
我是不是做错了什么,或者在 LightInject 中有什么方法可以实现我上面描述的行为吗?
如果不清楚请告诉我,我可以尝试提供更多信息。谢谢!
Handler class 关闭两个通用参数并且以后无法更改。 只需尝试手动创建 Handler 的新实例 class,您会发现无法指定通用参数,因为它们已关闭。
将您的代码更改为此。
public class Handler<T, SomeResponseType> : IAsyncRequestHandler<T, SomeResponseType> where T:IAsyncRequest<SomeResponseType>
{
public Task<SomeResponseType> Handle(T message)
{
throw new NotImplementedException();
}
}
像这样注册和解决
var container = new ServiceContainer();
container.Register(typeof(IAsyncRequestHandler<,>), typeof(Handler<,>));
var instance = container.GetInstance<IAsyncRequestHandler<InheritedType, SomeResponseType>>();