Castle Windsor - преобразование общей реализации в базовый тип

Я пытаюсь использовать Windsor в качестве фабрики для реализации спецификаций на основе подтипов XAbstractBase (в моем случае это базовый класс абстрактных сообщений).

У меня есть такой код:

public abstract class XAbstractBase { }
public class YImplementation : XAbstractBase { }
public class ZImplementation : XAbstractBase { }

public interface ISpecification<T> where T : XAbstractBase
{
    bool PredicateLogic();
}

public class DefaultSpecificationImplementation : ISpecification<XAbstractBase>
{
    public bool PredicateLogic() { return true; }
}

public class SpecificSpecificationImplementation : ISpecification<YImplementation>
{
    public bool PredicateLogic() { /*do real work*/ }
}

Код регистрации моего компонента выглядит так:

container.Register(
    AllTypes.FromAssembly(Assembly.GetExecutingAssembly())
    .BasedOn(typeof(ISpecification<>))
    .WithService.FirstInterface()
)

Это нормально работает, когда я пытаюсь разрешить ISpecification<YImplementation>; он правильно разрешает SpecificSpecificationImplementation.

Однако когда я пытаюсь разрешить ISpecification<ZImplementation> Windsor выдает исключение:

"No component for supporting the service ISpecification'1[ZImplementation, AssemblyInfo...] was found"

Поддерживает ли Виндзор преобразование общих реализаций в базовые классы, если более конкретная реализация не зарегистрирована?


person Matt Mills    schedule 14.06.2010    source источник


Ответы (2)


См. это сообщение.

Обновлять

Хорошо, теперь я понимаю, что ты делаешь не так. У вас нет службы для ISpecification<ZImplementation>, поэтому неудивительно, что Виндзор не может решить эту проблему.

Это совсем не проблема Виндзора.

person Krzysztof Kozmic    schedule 14.06.2010
comment
Это был один из лучших постов, которые я нашел до того, как разместил здесь вопрос. Я ищу, можно ли решить ситуацию с нулем или более (сообщение касается только одной или нескольких ситуаций, но я предполагаю, что было бы тривиально добавить возвращаемое значение по умолчанию), используя только встроенный Windsor -в помещениях. Если мне все равно придется написать фабрику, я с большей вероятностью просто зарегистрирую ее и введу как обычно. - person Matt Mills; 15.06.2010
comment
Хорошо; Я понимаю, почему это невозможно. Спасибо! - person Matt Mills; 16.06.2010
comment
@adriaanp Ссылка исправлена. - person Patrick Quirk; 01.02.2016

Вы можете зарегистрировать его как открытый общий, чтобы обеспечить запасной вариант, например

public class DefaultSpecificationImplementation<T> : ISpecification<T>
    where T : XAbstractBase
{
    public bool PredicateLogic() { return true; }
}

as

Component.For(typeof(ISpecification<>))
    .ImplementedBy(DefaultSpecificationImplementation<>)

Затем, когда Windsor не может найти конкретную реализацию, он будет использовать общую.

person AlexFoxGill    schedule 15.07.2014