2

我正在尝试使用 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,因为InheritedTypeimplements SomeType

我在这里做错了什么,或者 LightInject 有什么方法可以实现我上面描述的行为?


如果不清楚,请告诉我,我可以尝试提供更多信息。谢谢!

4

1 回答 1

3

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>>();
于 2016-09-09T18:29:13.780 回答