Windsor解析通用服务子类型

时间:2009-12-07 03:08:40

标签: dependency-injection castle-windsor

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>>();

是否有设置Windsor容器分辨率,以便bars同时包含FooImplAFooImplB

2 个答案:

答案 0 :(得分:3)

你做不到。为什么?尝试运行这个,这是你想要温莎做的。

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

它不会编译。

答案 1 :(得分: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代码中获得的。