按惯例在Unity中注册具体类型的泛型类型

时间:2015-09-29 02:32:24

标签: c# generics unity-container

我想知道如何按照惯例注册我的查询处理程序,具体来说,我有3种界面类型

IQuery
IQueryResult
IQueryHandler<IQuery, IQueryResult>

和具体类型看起来像

ArticlesQuery : IQuery
ArticlesQueryResult : IQueryResult
ArticlesQueryHandler : IQueryHandler<ArticlesQuery, ArticlesQueryResult>

随着后一类型的注册数量不断增加,我希望按照惯例注册这些注册,但似乎没有简单的方法可以做到这一点。

单个映射看起来像这样

container.RegisterType<IQueryHandler<ArticlesQuery, ArticlesQueryResult>,
        ArticlesQueryHandler>();

按照惯例注册我尝试了

的内容
container.RegisterTypes(AllClasses.FromLoadedAssemblies()
       .Where(t => typeof (IQueryHandler<,>).IsAssignableFrom(t)), WithMappings.FromAllInterfaces);

但是失败了(没有发现任何类型也没有注册)。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

container.RegisterTypes(
    AllClasses
    .FromLoadedAssemblies()
    .Where(t => 
        t.GetInterfaces().Any(i =>
            i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IQueryHandler<,>))),
    WithMappings.FromAllInterfaces);

顺便说一句,IQueryHandler<,>不能从任何类型分配,因为它是一个开放的泛型类型。