Castle Windsor — DefaultInterface при разрешении

Я только недавно начал пользоваться Castle Windsor и у меня есть вопрос.

Предположим, у меня есть интерфейс — IService — и пять классов, которые его реализуют (IServiceOne, IServiceTwo, IServiceThree) и так далее.

Оттуда у меня есть классы, которые реализуют каждый из IServices. Они соответствующим образом названы как ServiceOneProvider, ServiceTwoProvider, ServiceThreeProvider и т. д. В этих классах я разрешаю объект IService.

Итак, я хочу знать: возможно ли разрешить этот объект IService с использованием эквивалента DefaultInterfaces (который можно использовать во время регистрации), чтобы ServiceOneProvider получил объект ServiceOne, ServiceTwoProvider получил объект ServiceTwo и так далее?

Спасибо,

-Росс


person Ross    schedule 14.10.2011    source источник


Ответы (1)


Я не видел ничего встроенного в Windsor, чтобы делать что-то подобное. Я думал о HandlerSelector, но когда селектор работает, вы не знаете тип, который запрашивает зависимость, поэтому это не поможет.

Вы можете использовать TypedFactoryFacility. Просто создайте интерфейс для возврата ваших объектов IService (версия C#):

public interface IProviderFactory
{
    IService GetServiceOne();
    IService GetServiceTwo();
    IService GetServiceThree();
}

Затем назовите свои экземпляры IService как «ServiceOne», «ServiceTwo» и т. д.

Component.For<IService>().ImplementedBy<ServiceOne>().Named("ServiceOne"),
Component.For<IService>().ImplementedBy<ServiceTwo>().Named("ServiceTwo"),
Component.For<IService>().ImplementedBy<ServiceThree>().Named("ServiceThree"),

Затем сделайте своих провайдеров зависимыми от фабрики и вызовите соответствующий метод Get:

public class ServiceOneProvider
{
    public ServiceOneProvider(IProviderFactory factory)
    {
        var service = factory.GetServiceOne();
    }
}

public class ServiceTwoProvider
{
    public ServiceTwoProvider(IProviderFactory factory)
    {
        var service = factory.GetServiceTwo();
    }
}

public class ServiceThreeProvider
{
    public ServiceThreeProvider(IProviderFactory factory)
    {
        var service = factory.GetServiceThree();
    }
}
person PatrickSteele    schedule 14.10.2011