2009-12-07 70 views
0
interface IFoo<T> { } 

interface IBar { } 

class BarImpl : IBar { } 

class FooImplA : IFoo<IBar> { } 

class FooImplB : IFoo<BarImpl> { } 

container.Register(
    AllTypes.Of(typeof(IFoo<>)).From(assem) 
     .WithService.FirstInterface()); 

var bars = container.ResolveAll<IFoo<BarImpl>>(); 

反正是有建立溫莎解析容器,使bars將包括FooImplAFooImplB溫莎解決通用服務亞型

回答

3

你不能。爲什麼?嘗試運行這個,這是你想要Windsor做的。

var a = new FooImplA(); 
var b = new FooImplB(); 
var bars = new IFoo<BarImpl>[] { a, b }; 

它不會編譯。

+0

是的......這是真的,我忘了提到BarImpl:IBar。所以城堡無法做到這一點?我真正想要的是IFoo 作爲返回類型,w /特定impl作爲查找類型。我意識到所有類型的IBar都必須註冊。有沒有什麼習慣我可以做?得到IFoo ,找到typeof(T).IsAssignableFrom(typeof(BarImpl))容器中的所有類型。 – neouser99

0

嗯,這就是我如何「解決」這個......雖然我仍然認爲這可能是我不明白我自己的問題,或者試圖做一些愚蠢的事情。

private static IEnumerable<object> ResolveTypeHierarchy(Type type, Type msgType) { 
    var handlers = new List<object>(); 

    foreach (var interfaceType in msgType.GetInterfaces()) { 
     var gType = type.MakeGenericType(interfaceType); 
     handlers.AddRange(container.ResolveAll(gType)); 
    } 

    var baseType = msgType; 
    while (null != baseType) { 
     var gType = type.MakeGenericType(baseType); 
     handlers.AddRange(container.ResolveAll(gType)); 
     baseType = baseType.BaseType; 
    } 

    return handlers; 
} 

ResolveTypeHierarchy(typeof(IFoo<>), typeof(BarImpl)); 
    => { FooImplA, FooImplB } 

我應該注意到,這是從Rhino.ServiceBus代碼的研究和窺視中獲得的。