Windsor Resolving универсальный сервис SubTypes - PullRequest
0 голосов
/ 07 декабря 2009
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 включало в себя FooImplA и FooImplB?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2009

Вы не можете. Зачем? Попробуйте запустить это, что вы хотите, чтобы Виндзор делал.

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

Не скомпилируется.

0 голосов
/ 08 декабря 2009

Ну, вот как я "решил" это ... хотя я все еще думаю, что это возможно, либо я не понял свою собственную проблему, либо пытаюсь сделать что-то глупое.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...