C# Unity 3.5:通过其开放的通用接口检索具体实现

C# Unity 3.5:通过其开放的通用接口检索具体实现,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,这篇博文描述了存储库模式的一个不错的替代方案 作者建议使用命令和查询来代替存储库。这篇博客文章描述了.NET/C#中查询部分的实现 查询和查询处理程序有两个接口: public interface IQuery<TResult> { } public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult> { TResult Handle(TQuery quer

这篇博文描述了存储库模式的一个不错的替代方案

作者建议使用命令和查询来代替存储库。这篇博客文章描述了.NET/C#中查询部分的实现

查询和查询处理程序有两个接口:

public interface IQuery<TResult>
{
}

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
    TResult Handle(TQuery query);
}

如果您将有许多特定的
IQueryHandler
实现,而没有一个泛型版本,那么就不能使用开放泛型进行注册。但是您可以使用反射来查找所有实现并注册它们。(这是RegisterTypes在幕后为您做的事情)

您在问题中的RegisterTypes调用中的尝试很接近,但您使用了
with mappings.FromMatchingInterface
。这将只注册其接口符合
MyClass:IMyClass
命名约定的类(在类名前加一个
'I'
)。如果您改为使用Mappings.FromAllInterfaces注册
,您将获得所需的注册

container.RegisterTypes(
    AllClasses.FromLoadedAssemblies(),
    WithMappings.FromAllInterfaces,
    WithName.Default);

如果您只需要注册这些类,那么您可以将这些类筛选为只实现您所追求的接口的类

public static class EnumerableTypeExtensions
{
    public static IEnumerable<Type> WhichImplementsInterface<T>
        (this IEnumerable<Type> types)
    {
        return types.WhichImplementsInterface(typeof (T));
    }

    public static IEnumerable<Type> WhichImplementsInterface
        (this IEnumerable<Type> types, Type interfaceType)
    {
        return types.WhichImplementsInterface(interfaceType.Name);
    }

    public static IEnumerable<Type> WhichImplementsInterface
        (this IEnumerable<Type> types, string interfaceTypeName)
    {
        return types.Where(t => t.GetInterface(interfaceTypeName) != null);
    }
}
公共静态类EnumerableTypeExtensions
{
当元素插入界面时,公共静态IEnumerable
(这是可数类型)
{
返回类型。当元素进入接口时(typeof(T));
}
当元素插入界面时,公共静态IEnumerable
(此IEnumerable类型,类型interfaceType)
{
返回类型.whichImplementsInInterface(interfaceType.Name);
}
当元素插入界面时,公共静态IEnumerable
(此IEnumerable类型,字符串接口名称)
{
返回类型。其中(t=>t.GetInterface(interfaceTypeName)!=null);
}
}
然后你可以像这样使用这些过滤器

container.RegisterTypes(
    AllClasses.FromLoadedAssemblies().WhichImplementsInterface(typeof(IQueryHandler<,>)),
    WithMappings.FromAllInterfaces,
    WithName.Default);
container.RegisterTypes(
AllClasses.FromLoadedAssemblies().whichImplementsInInterface(typeof(IQueryHandler)),
使用mappings.fromalinterfaces,
WithName.Default);
container.RegisterType<IQueryHandler<FindUsersBySearchTextQuery, User[]>, 
                       FindUsersBySearchTextQueryHandler>();
container.RegisterTypes(
    AllClasses.FromLoadedAssemblies(),
    WithMappings.FromMatchingInterface,
    WithName.Default);
container.RegisterTypes(
    AllClasses.FromLoadedAssemblies(),
    WithMappings.FromAllInterfaces,
    WithName.Default);
public static class EnumerableTypeExtensions
{
    public static IEnumerable<Type> WhichImplementsInterface<T>
        (this IEnumerable<Type> types)
    {
        return types.WhichImplementsInterface(typeof (T));
    }

    public static IEnumerable<Type> WhichImplementsInterface
        (this IEnumerable<Type> types, Type interfaceType)
    {
        return types.WhichImplementsInterface(interfaceType.Name);
    }

    public static IEnumerable<Type> WhichImplementsInterface
        (this IEnumerable<Type> types, string interfaceTypeName)
    {
        return types.Where(t => t.GetInterface(interfaceTypeName) != null);
    }
}
container.RegisterTypes(
    AllClasses.FromLoadedAssemblies().WhichImplementsInterface(typeof(IQueryHandler<,>)),
    WithMappings.FromAllInterfaces,
    WithName.Default);