gpt4 book ai didi

unity-container - 将 IOC 容器用于多种具体类型

转载 作者:行者123 更新时间:2023-12-01 13:03:47 27 4
gpt4 key购买 nike

我想在我的应用程序中实现 IOC,但我很困惑,在我的应用程序中我有多个实现接口(interface)的具体类。考虑这种情况:-

我有一个接口(interface) ICommand 和以下实现此接口(interface)的具体类型:-

  • 地址
  • 添加联系人
  • 删除地址
  • 删除联系人

基本上用户在 UI 中执行所有这些操作,然后将列表传递到执行每个命令的服务层。

所以在GUI层我会写

ICommand command1 = new AddAddress();
ICommand command2 = new RemoveContact();

在命令管理器中

List<ICommand> listOfCommands = List<ICommand>();
listOfCommands.Add(command1);
listOfCommands.Add(command2);

然后最后将listOfCommands传递给服务层。

现在根据我对 IOC 的理解,只有一个具体类映射到接口(interface)。我们使用此语法从 StructureMap 容器中获取具体类型。

ICommand command = ObjectFactory.GetInstance<ICommand>();

在这种情况下我应该如何实现 IOC?

最佳答案

在这种情况下,您最好将命令变成值对象,即不是由 IoC 容器创建:

class AddAddressCommand {
public AddAddressCommand(string address) {
Address = address;
}
public string Address { get; private set; }
}

当你创建一个命令时,你确实需要一个特定的实现,并且你想要精确地参数化它,这两个问题都会对 IoC 容器的服务起作用。如果您决定在某个时候序列化命令对象,这将变得更加重要。

相反,将执行命令的服务层组件制作成 IoC 提供的组件:

class AddAddressHandler : IHandler<AddAddressCommand> {
public AddAddressHandler(ISomeDependency someDependency) { ... }
public void Handle(AddAddressCommand command) {
// Execution logic using dependencies goes here
}
}

在您的情况下,接受要执行的命令列表的组件需要为每个命令解析适当的处理程序并将命令对象分派(dispatch)给它。

这里有一些关于如何使用 Windsor 执行此操作的讨论:http://devlicious.com/blogs/krzysztof_kozmic/archive/2010/03/11/advanced-castle-windsor-generic-typed-factories-auto-release-and-more.aspx - 支持您选择的 IoC 容器的社区将能够帮助您进行配置。

关于unity-container - 将 IOC 容器用于多种具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238753/

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