我正在尝试使用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>
的实现调用我的中介时,它失败了。因为InheritedType
实现了SomeType
,所以我希望得到我注册的Handler
。
我在这里做错了什么,或者有任何方式在LightInject实现我上面描述的行为?
让我知道如果它不清楚,我可以试着提供更多的信息。谢谢!
Handler类关闭两个泛型参数,以后不能更改。只需尝试手动创建Handler类的新实例,您将看到无法指定泛型参数,因为它们是关闭的。
把你的代码改成这样
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>>();