c# - 创建 StructureMap 容器的克隆

标签 c# mvvm structuremap

我正在开发一个 MVVM 应用程序。它有一些整个应用程序需要的对象(单个实例),它有一些只有某些窗口/控件需要的对象(每个控件一个实例)。

我想将我的 StructureMap 容器配置为包含所有应用程序实例,就像平常一样。当我打开一个窗口/控件时,我想创建一个容器的克隆并将该控件所需的对象添加到克隆的配置中。克隆应该扩展原始容器并且应该包含相同的配置和实例。

这可能与 StructureMap 有关吗? (我正在查看嵌套容器,但我不确定这是我想要的)。

更多详情...

这是一个显示行为的测试。首先是标准的东西:

[Test]
public void Mupp()
{
    var parent = new Container(x =>
        {
            x.For<IMyServiceAgent>().Singleton().Use<MyServiceAgent>();
        });
    var parentServiceAgent = parent.GetInstance<IMyServiceAgent>();

然后我创建克隆。它具有与父级相同的实例。 (这是我正在寻找的方法 CreateCloneOf() 的实现。)
    IContainer scoped1 = CreateCloneOf(parent);
    scoped1.GetInstance<IMyServiceAgent>().ShouldBeTheSameAs(parentServiceAgent);

我想用我的本地对象扩展配置。
    scoped1.Configure(x =>
        {
            x.For<IMyPresenter>().Singleton().Use<MyPresenter>();
        });

    var scopedPresenter1 = scoped1.GetInstance<IMyPresenter>();
    scoped1.GetInstance<IMyPresenter>().ShouldBeTheSameAs(scopedPresenter1);

创建容器的第二个克隆不会与第一个克隆共享实例(或配置)。
    IContainer scoped2 = CreateCloneOf(parent);
    scoped2.Configure(x =>
        {
            x.For<IMyPresenter>().Singleton().Use<MyPresenter>();
        });
    scoped2.GetInstance<IMyPresenter>().ShouldNotBeTheSameAs(scopedPresenter1);

在作用域容器中配置的内容不应该在父容器中
    parent.GetInstance<IMyPresenter>(); // Should throw

应该可以从作用域容器创建作用域容器。
    IContainer moreScoped = CreateCloneOf(scoped1);
    moreScoped.GetInstance<IMyPresenter>().ShouldBeTheSameAs(scopedPresenter1);
}

最佳答案

从您的问题来看,听起来您正在寻找的是嵌套容器。

您可以通过创建嵌套容器来实现您的目标(嵌套容器是适用于短期操作的容器的副本,对嵌套容器的任何更改都不会反射(reflect)在从中克隆它的容器中 - read more here)。

拥有嵌套容器后,您可以为要使用嵌套容器的模块所需的新操作添加 StructureMap 注册表。

像这样:

设置:

public void ApplicationBootstrap()
{
    IContainer container = StructureMapCoreSetup.Initialise();
    container.Configure(c =>
    {
        c.IncludeRegistry<DefaultRegistry>();
    });
}

用法:
public class ApplicationModule
{
    public ApplicationModule(IContainer container)
    {
        childContainer = container.GetNestedContainer();
        childContainer.Configure(x =>
        {
            x.AddRegistry<ModuleSpecificRegistry>();
        });
    }
}

对嵌套容器的任何更改都不会反射(reflect)在任何其他容器中的任何容器中(除非您创建了嵌套容器的嵌套实例),并且一旦您完成该容器,就可以将其丢弃。

希望这是您正在寻找的东西,或者它至少为您指明了正确的方向!

关于c# - 创建 StructureMap 容器的克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27834616/

相关文章:

asp.net-mvc - 结构图2.6.1 Bootstrap

c# - 在表单之间传递数据以绘制曲面,不起作用

c# - 在 C# 中发出和接收 HTTP 请求

wpf - 为什么在定义TreeView.ItemTemplate后TreeView不会自动为子节点选择DataTemplates?

jquery - Kendo MVVM - 使用 data-show 绑定(bind)布局

structuremap - 有没有办法让 structmap 注入(inject)接口(interface)所有实现的数组?

C# MongoDB 基于点数组的排名

c# - System.Text.Json 中 Newtonsoft.Json DefaultValueHandling = DefaultValueHandling.Ignore 选项的等价物是什么

c# - 在 WPF MVVM 中验证和保存数据如何正常工作?

c# - 使用 WCF 为 IoC 配置 StructureMap(依赖注入(inject))