2009-12-07 4 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>>(); 

Есть в любом случае для настройки разрешения контейнера Windsor, так что bars будет включать в себя как FooImplA и FooImplB?Windsor Устранение общего обслуживание подтипы

ответ

3

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

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

Не скомпилировать.

+0

да ... это правда, я забыл упомянуть, что BarImpl: IBar. так что замок не может это сделать? то, что я действительно хочу, это IFoo как возвращаемый тип, с конкретным импом в качестве типа поиска. я понимаю, что все типы IBar должны быть зарегистрированы. нет ничего обычая, что я могу сделать? get 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.

Смежные вопросы