Регистрация общего абстрактного класса в замке Виндзор - PullRequest
1 голос
/ 26 октября 2011

Я пытаюсь зарегистрировать тип по соглашению, я упростил мой случай в этом примере:

public abstract class BaseEntity{}

public class EntityA : BaseEntity{}

public class EntityB : BaseEntity{}

public abstract class BaseClass
{
    //...
}

public abstract class GenericBaseClass<T> : BaseClass where T : BaseEntity
{
    //..
}

public class ConcreteA : GenericBaseClass<EntityA>
{
    //...
}

public class ConcreteB : GenericBaseClass<EntityB>
{
    //...
}

Я пытаюсь найти способ зарегистрировать GenericBaseClass для возврата ConcreteAпри запросе GenericBaseClass<EntityA>.При попытке решить эту проблему, я получаю исключение, говорящее что-то вроде:

Произошла ошибка активации при попытке получить экземпляр типа GenericBaseClass`1, ключ ""

ЕслиЯ изменяю определение GenericBaseClass<T> с абстрактного класса на интерфейс, этот регистрационный код работает:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>()
         .BasedOn(typeof(GenericBaseClass<>))
         .WithService.FirstInterface());

Однако мне нужно использовать абстрактный класс, потому что мне нужно написать код внутри него.Я могу зарегистрировать каждый класс ConcreteX вручную, но это не очень полезно.

Я пробовал с этим:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>()
         .BasedOn(typeof(GenericBaseClass<>))
         .WithService.Base());

Отладка, я вижу, что тип недобавлен в контейнер.

Я использую Castle Windsor 2.6.

Спасибо.

1 Ответ

0 голосов
/ 29 октября 2011

Это работает:

container.Register(AllTypes.FromAssemblyContaining<ConcreteA>()
                    .BasedOn(typeof (GenericBaseClass<>))
                    .WithService.Base());

Если вы видите, что типы не добавляются в контейнер, убедитесь, что вы сканируете правильную сборку (которая содержит типы реализации, а не типы служб).*

...