簡體   English   中英

Castle Windsor:開放泛型類型的條件注冊

[英]Castle Windsor: Conditional registration of open generic types

我有以下內容:

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>

我怎么能做到這一點?

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的額外參數。 然后獲取從Type( 例如 )繼承的所有類型並注冊它們。

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;
}

您可以使用“where T:typename”語法限制泛型的類型,其中“typename”指的是指定類型“T”必須繼承(或實現)的類型。 在您的情況下,“其中T:ISuperType”將匹配特定類型,沒有限制的版本應匹配所有其余類型。

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

如果它不能在編譯時完成,它總是可以在運行時完成(使用f.ex。'是')。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM