Я новичок в IoC и Castle Windsor.
Вопрос больше относится к IoC, но я просто выбрал Castle в качестве своего предпочтительного оружия.
Я сразу столкнулся с проблемой, котораякажется невозможным построить контейнер из файла конфигурации или из одиночного файла.
Единственный способ, который мне подходит, - это использовать функцию Builder, которая будет каждый раз создавать весь контейнер, а затем позволять мне указыватьтипы, посмотрите на этот пример:
У меня есть представление:
public interface IView
{
}
Есть 2 конкретных реализации этого представления:
public class ConcreteViewA : IView
{
}
public class ConcreteViewB : IView
{
}
У меня есть контроллер, которыйоперирует с представлением:
public class Controller
{
public Controller(IView view) { }
public void Load() { }
}
Я создаю функцию, которая создает мой контейнер IoC и регистрирует общие типы, единственный тип, который я могу зарегистрировать, - это мой контроллер, так как все это остается неизменным:
WindsorContainer BuildContainer()
{
var container = new WindsorContainer();
container.Register(Component.For<Controller>().ImplementedBy<Controller>());
return container;
}
У меня есть 2 (корневые) точки входа:
void RootMethod1()
{
var container = BuildContainer();
container.Register(Component.For<IView>().ImplementedBy<ConcreteViewA>());
var controller = container.Resolve<Controller>();
controller.Load();
}
void RootMethod2()
{
var container = BuildContainer();
container.Register(Component.For<IView>().ImplementedBy<ConcreteViewB>());
var controller = container.Resolve<Controller>();
controller.Load();
}
Как вы видите, мне приходится каждый раз перестраивать контейнер, так как мне нужно указать, что использовать для IView для каждогоконтекстаЯ нахожусь в. Что, если Контейнер дорогой, чтобы восстановить (много типов и т. д.), как я могу спроектировать это?