Зарегистрируйте все классы от базового до в Castle Windsor, используя интерфейс Fluent - PullRequest
2 голосов
/ 18 января 2012

У меня есть абстрактный базовый класс Search.Абстрактный класс IndexedRepositorySearch происходит от Search.Абстрактный класс FacetSearch происходит от IndexedRepositorySearch.Конкретные классы IngredientFacetSearch и RecipeFacetSearch происходят от FacetSearch.

В настоящее время мы регистрируем все, что происходит от Search в замке Виндзор, следующим образом:

AllTypes.FromAssembly(assembly)
        .BasedOn<Search.Search>()
        .WithServiceBase()
        .WithServiceSelf()
        .LifestyleTransient()
        .AllowMultipleMatches()

Когда мызатем позвоните

_container.ResolveAll<FacetSearch>(new { searchInput = input, searchResults });

Это ничего не решает из контейнера.Когда я ставлю точку останова на контейнер после того, как все было зарегистрировано, и проверяю AllComponents в отладчике, я вижу и IngredientFacetSearch, и RecipeFacetSearch, но у каждого из них есть только две связанные службы: их собственная личность и Search, их база.Что вы ожидаете, учитывая, что они зарегистрированы с .WithServiceBase() и .WithServiceSelf().

Так что вопрос в том, как заставить их решить, позвонив по номеру ResolveAll<FacetSearch>()?

Я уверен, что эточто-то простое, но я буду проклят, если смогу его найти.

Заранее спасибо.

1 Ответ

3 голосов
/ 04 февраля 2012

У нас была похожая проблема, но нам нужно было зарегистрировать только первую базу, которая была абстрактной. Я решил это, используя WithServiceSelect, но обернул его в метод расширения, который будет использоваться так:

AllTypes.FromAssembly(assembly)
        .BasedOn<Search.Search>()
        .WithServiceLastAbstractBase(),

Определение метода расширения:

public static BasedOnDescriptor WithServiceLastAbstractBase(this BasedOnDescriptor basedOn)
{
    return basedOn.WithServiceSelect(selectLastAbstractBase);
}

private static IEnumerable<Type> selectLastAbstractBase(Type type, Type[] basetypes)
{
    var baseType = type;

    do
    {
        baseType = baseType.BaseType;
    } while (baseType != null && !baseType.IsAbstract);

    if (baseType == null)
    {
        throw new ArgumentException("There are no abstract base types for: " + type);
    }

    return new [] { baseType };
}
...