【问题标题】:LightInject doesn't resolve inherited generic typesLightInject 不解析继承的泛型类型
【发布时间】:2016-09-09 00:39:41
【问题描述】:

我正在尝试使用 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&lt;InheritedType,SomeResponseType&gt; 时,它失败了。我本来希望得到我注册的Handler,因为InheritedType 实现了SomeType

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


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

【问题讨论】:

    标签: c# generics mediator light-inject mediatr


    【解决方案1】:

    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>>();
    

    【讨论】:

    • 我最终采用了一种不同的方法来避免额外的泛型层,但是需要了解的好信息,谢谢!谢谢你的图书馆!
    猜你喜欢
    • 2018-09-27
    • 2015-09-15
    • 2018-08-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多