В настоящее время у нас есть код, который выглядит примерно так, как показано ниже, при этом завод вводится во множество классов, которые затем вызывают фабрику, чтобы получить экземпляр того, что они хотят.Общая регистрация в Виндзоре с использованиемFactoryMethod
public class Service
{
public Service(IFactory factory)
{
_car = factory.GetCar<Entity>();
}
}
public class Car : ICar
{
}
public interface IFactory
{
ICar<TEntity> GetCar<TEntity>();
IBoat<TEntity> GetBoat<TEntity>();
}
public class Factory : IFactory
{
ConnectionDetails _connectionDetails;
public Factory(ConnectionDetails connectionDetails)
{
_connectionDetails = connectionDetails;
}
TEntity GetCar<TEntity>()
{
var car = new Car<TEntity>(_connectionDetails);
car.Initialize();
return car;
}
}
Я надеялся, чтобы иметь возможность создать решение, которое позволило бы для запроса зависимость непосредственно на Car<TEntity>
без необходимости проходить через завод первым.
Ниже приведен пример установки для одного TEntity
, но как бы я установил его как общий?
Я пробовал использовать открытые дженерики, но я не вижу, как я могу получить правильный тип возврата из .UsingFactoryMethod()
.
Я знаю, что могу получить RequestedType
из CreationContext
, но я не вижу, как я могу использовать это для решения этой проблемы.
public class Installer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<ICar<TEntity>>().UsingFactoryMethod(
kernel =>
{
var factory = kernel.Resolve<IFactory>();
return factory.GetCar<TEntity>();
}));
}
}
Я действительно не думал об изменении поведения этих классов, но это имеет смысл. Я должен быть в состоянии пропустить фабрику все вместе. Я отдам его. – lxalln
Вы обнаружите, что это значительно облегчает масштабирование при добавлении новых типов, так как вы больше не зависите от изменения фабрики, чтобы обрабатывать детали создания. –
Это хорошо работает сейчас, я просто не думал о реструктуризации настолько глубоко. Фабрика уже существовала, я не считал ее устаревшей. – lxalln