Замок Виндзор - DefaultInterface при разрешении - PullRequest
1 голос
/ 14 октября 2011

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

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

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

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

Спасибо,

-Ross

1 Ответ

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

Я не видел ничего встроенного в Виндзор, чтобы сделать что-то подобное. Я думаю о 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();
    }
}
...