Castle Windsor - преобразование универсальной реализации в базовый тип - PullRequest
2 голосов
/ 14 июня 2010

Я пытаюсь использовать 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> Виндзор выдает исключение:

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

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

Ответы [ 2 ]

0 голосов
/ 15 июля 2014

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

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

как

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

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

0 голосов
/ 15 июня 2010

См. этот пост.

Обновление

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...