Я новичок в IoC и Castle Windsor.
Вопрос больше связан с IoC, но я просто выбрал Castle в качестве своего любимого оружия.
Я сразу же столкнулся с проблемой, что создать контейнер из файла конфигурации или синглтона не представляется возможным.
Единственный способ, который кажется мне работающим, - это использовать функцию Builder, которая каждый раз будет строить весь контейнер, а затем позволить мне указать типы, посмотрите на этот пример:
У меня есть мнение:
public interface IView
{
}
Есть две конкретные реализации этого представления:
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 (Root) точки входа:
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 для каждого контекста, в котором я нахожусь. Что делать, если перестраивать контейнер дорого (много типов и т. Д.), Как я могу дизайн это?