0

我有我正在编写的这个应用程序,由于它的大小,它在组织方面变得有点灾难。我认为这将是使用 StructureMap v3.1.4.143 实现 IoC 的理想选择。

我正在我的 Program.cs 中设置我的对象图并创建一个应用程序上下文,该上下文在其构造函数中具有一些依赖项。其中之一是启动画面形式。当应用程序上下文运行时,它会显示此表单,并根据初始化时发生的情况更新表单上的当前状态。

这个对象是非常临时的,一旦我处理它,StructureMap 会用它做什么?它是否以某种方式缓存对象?如果确实以某种方式缓存了对象,那么将其保留为根和处置似乎有点浪费。我应该使用嵌套容器吗?如果我可以管理它,我会尽量避免传递容器,并且应用程序上下文必须在调用 Application.Run (它是模态的)时处理这个对象。那么有没有好的方法来处理这种情况呢?我真的不想让对象闲逛,当它们不再使用时,GC 无法访问它们。

这会导致另一个可能出现的设计问题:如果我单击一个按钮,然后创建、使用和处理一个新表单,我将如何通过 StructureMap 处理这个问题?我需要在运行时创建表单,并且只能按需创建。而且我不想在用户完成后保留它(我认为这很浪费)。如果我处置表单,并使用由 StructureMap 注入的工厂方法创建一个新实例,它会以处置状态返回前一个实例吗?

现在只是为了解决这个问题:在表单关闭时“隐藏”它不是一个选项。

这确实是一种不同的思维方式,我当然不习惯。因此,任何指导将不胜感激。

4

1 回答 1

1

作为序言,我想说我对 Forms 没有任何经验,我不确定 Forms 如何处理 IoC 容器集成——所以我不确定这个答案到底有多大用处;然而,听起来这个问题的解决方案是使用 StructureMap 的嵌套容器功能。

文档摘录:

嵌套容器是 StructureMap 中的一项强大功能,用于在短期操作的上下文中进行服务解析和干净的对象处置。嵌套容器是在 2.6 版中引入的,但在性能(在大型应用程序中创建嵌套容器的时间减少了 100 倍)和作为 3.0 版本的主要目标的生命周期机制方面都得到了极大的改进。

使用嵌套容器,您可以获取本质上是适用于短期操作的已配置容器的克隆。对嵌套容器的任何更改都不会反映在创建它的容器中。

创建嵌套容器非常简单,可以通过调用实例GetNestedContainer()上的方法来执行;IContainer这是一个例子:

IContainer container = new Container();
container.Configure(c =>
{
    c.IncludeRegistry<ConfigurationRegistry>();
});

IContainer myNestedContainer = container.GetNestedContainer();
myNestedContainer.Dispose();

正如您从示例中看到的那样,嵌套容器实现了IDisposable接口,因此您可以在完成后手动处置容器。

于 2015-02-26T13:42:18.467 回答