Я только недавно начал пользоваться Castle Windsor и у меня есть вопрос.
Предположим, у меня есть интерфейс - IService - и пять классов, которые его реализуют (IServiceOne, IServiceTwo, IServiceThree) и так далее.
Оттуда у меня есть классы, которые реализуют каждый из IServices. Они соответствующим образом названы как ServiceOneProvider, ServiceTwoProvider, ServiceThreeProvider и т. д. В этих классах я разрешаю объект IService.
Итак, я хочу знать: возможно ли разрешить этот объект IService с использованием эквивалента DefaultInterfaces (который можно использовать во время регистрации), чтобы ServiceOneProvider получил объект ServiceOne, ServiceTwoProvider получил объект ServiceTwo и так далее?
Спасибо,
-Росс
Ответ 1 · PatrickSteele
Я не видел ничего встроенного в 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();
}
}