3

我有以下内容:

class Repository<T> : IRepository<T>
interface ISuperRepository<T> : IRepository<T>
class SuperRepository<T> : ISuperRepository<T>
interface ISuperType

我想在Castle Windsor DI进行有条件的注册IRepository<T>,如果TISuperType,则提供ISuperRepository<T>。否则,提供IRepository<T>.

例如,如果A : ISuperType,那么我想Resolve<IRepository<A>>提供SuperRepository<A>,并Resolve<IRepository<B>>提供Repository<B>

我怎样才能做到这一点?

4

2 回答 2

2

Castle Windsor不支持这样的事情,但是您可以使用简单的辅助方法来实现它:

public static void RegisterAccordingToISuperType<T>(this IWindsorContainer container)
{
    if (typeof (T).GetInterfaces().Contains(typeof (ISuperType)))
        container.Register(Component.For<IRepository<T>>()
                                    .ImplementedBy<SuperRepository<T>>());
    else
        container.Register(Component.For<IRepository<T>>()
                                    .ImplementedBy<Repository<T>>());
}

然后注册:

container.RegisterAccordingToISuperType<SuperType>();
container.RegisterAccordingToISuperType<int>();

决心将:

var super = container.Resolve<IRepository<SuperType>>();
var intRepo = container.Resolve<IRepository<int>>();

另一种选择是在Component.For. 然后获取从类型(例如)继承的所有类型并注册它们。

private static void Register(...)
{
    foreach (var type in GetInheriteTypes())
    {          
        container.Register(Component.For(typeof(IRepository<>),type)
                                    .ImplementedBy(typeof(SuperRepository<>)));
    }
    container.Register(Component.For(typeof(IRepository<>))
                                .ImplementedBy(typeof(Repository<>)));
}

private static IEnumerable<Type> GetInheriteTypes()
{
    var listOfBs = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
                    from assemblyType in domainAssembly.GetTypes()
                    where assemblyType.GetInterfaces().Contains(typeof(ISuperType))
                    select assemblyType).ToArray();
    return listOfBs;
}
于 2015-07-19T16:13:58.110 回答
-1

您可以使用“where T: typename”语法限制泛型用于哪些类型,其中“typename”指的是指定类型“T”必须继承(或实现)的类型。在您的情况下,“其中 T:ISuperType”将匹配特定类型,并且没有限制的版本应该匹配所有其余类型。

参考。https://msdn.microsoft.com/en-us/library/bb384067.aspx

如果它不能在编译时完成,它总是可以在运行时完成(使用 f.ex. 'is')。

于 2015-07-19T15:24:05.983 回答