gpt4 book ai didi

c# - 多种具体类型的 CaSTLe Windsor IoC 容器实例化

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:09 24 4
gpt4 key购买 nike

我是 IoC 和温莎城堡的新手。

这个问题与 IoC 更相关,但我只是选择城堡作为我选择的武器。

我立即遇到了一个问题,似乎无法从配置文件或单例构建容器。

似乎对我有用的唯一方法是使用每次构建整个容器的 Builder 函数,然后让我指定类型,看这个例子:

我有一个观点:

public interface IView
{
}

此 View 有 2 个具体实现:

public class ConcreteViewA : IView
{
}

public class ConcreteViewB : IView
{
}

我有一个在 View 上操作的 Controller :

public class Controller
{
public Controller(IView view) { }
public void Load() { }
}

我创建了一个构造我的 IoC 容器并注册通用类型的函数,我唯一可以注册的类型是我的 Controller ,因为这是保持不变的所有类型:

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 的内容。如果容器的重建成本很高(很多类型等),我该如何设计?

最佳答案

据我了解,您需要 Controller 类的两个不同实例(每个实例都使用不同的 IView 类型构造)。实现这一点的最简单方法是注册两个具有不同名称和不同依赖项的组件。

WindsorContainer BuildContainer()
{
var container = new WindsorContainer();

container.Register(Component.For<Controller>().Named("ControllerWithViewA")
.ImplementedBy<Controller>()
.DependsOn(Property.ForKey(typeof(IView))
.Is(typeof(ConcreteViewA)));
container.Register(Component.For<Controller>().Named("ControllerWithViewB")
.ImplementedBy<Controller>()
.DependsOn(Property.ForKey(typeof(IView))
.Is(typeof(ConcreteViewB)));
return container;
}

然后您可以在需要时要求任何 Controller 。

void RootMethod1()
{
var container = BuildContainer();
var controller = container.Resolve<Controller>("ControllerWithViewA");
controller.Load();
}

void RootMethod2()
{
var controller = container.Resolve<Controller>("ControllerWithViewB");
controller.Load();
}

使用 DI 时要记住的一些事情

  1. 只构建您的容器一次(一次又一次地构建它是浪费时间和资源)。

  2. 非常确定哪些依赖项要注入(inject),哪些不注入(inject)。对所有内容过度使用 DI 会导致容器膨胀,这是维护方面的噩梦。

  3. 了解码件的生命周期(单例、 transient 、每线程等)。特别是对于 CaSTLe,默认生活方式是单例,这可能会在多线程场景中产生不一致的行为。

关于c# - 多种具体类型的 CaSTLe Windsor IoC 容器实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com