使用具有StructureMap的短期表单对象

时间:2015-02-24 15:41:53

标签: c# forms dependency-injection inversion-of-control structuremap3

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

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

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

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

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

这实际上是一种不同的思维方式,我当然不习惯。因此,我们将非常感谢任何指导。

1 个答案:

答案 0 :(得分:1)

作为序言,我想说我对表格没有任何经验我不确定表格如何处理IoC容器集成 - 所以我不确定究竟有多么有用这个答案可能是;但是听起来这个问题的解决方案就是使用StructureMap的Nested Container功能。

文档摘录:

  

嵌套容器是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接口,因此您可以在完成容器后手动处理容器。