创建结构图容器的克隆
本文关键字:结构图 创建 | 更新日期: 2023-09-27 18:36:37
我正在开发一个MVVM应用程序。它有一些整个应用程序需要的对象(单个实例),它有一些只有某些窗口/控件需要的对象(每个控件一个实例)。
我想像往常一样配置我的结构图容器以包含所有应用程序实例。当我打开窗口/控件时,我想创建容器的克隆,并将该控件所需的对象添加到克隆的配置中。克隆应扩展原始容器,并应包含相同的配置和实例。
这可能与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);
}
从您的问题来看,听起来您正在寻找的是嵌套容器。
您可以通过创建嵌套容器来实现目标(嵌套容器是适合短期操作的容器副本,对嵌套容器的任何更改都不会反映在克隆它的容器中 - 在此处阅读更多内容)。
拥有嵌套容器后,您可以为要使用嵌套容器的模块所需的新操作添加 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>();
});
}
}
对嵌套容器所做的任何更改都不会反映在任何其他容器中的任何容器中(除非创建了嵌套容器的嵌套实例),并且容器可以在完成后释放
。希望这就是您正在寻找的,或者它至少为您指明了正确的方向!