Я пытаюсь зарегистрировать тип по соглашению, я упростил мой случай в этом примере:
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.
Спасибо.