考虑这段代码
GetInstance
我不想注册每个可以注入的具体类型,但是我希望它们对于每个构造函数注入都是唯一的,或者调用{{1}}
更新:
嗯,我必须使用NestedContainers错了吗?我想要的是为程序的子部分创建一个“Sub”容器(它是一个WPF客户端,所以子部分可以是一个像弹出窗口或其他的子模型)。子模型可以有自己的子模型或服务,它们可以是混凝土,也可以不是已注册的或者是已登记的。我根本不想注册的具体类型。我希望接口默认为Structuremap所谓的AlwaysUnique,但在我的世界里,这就是瞬态生命周期。对于99.9%的我的类型,我想要AlwaysUnique和0.01%我想在嵌套容器的生命周期中使用相同的引用。也许这个用例对嵌套容器不正确?编辑:典型的用例是仅在程序的一部分中进行事件聚合,如弹出模型及其子项
答案 0 :(得分:1)
如果我正确理解您的问题,我们可以明确指定 ILifecycle
- 为瞬态(每次请求时重新创建):<强> TransientLifecycle
强>
var container = new Container(x =>
{
x.For<IMyService>(new StructureMap.Pipeline.TransientLifecycle())
.Use<MyService>();
});
,这将解决此
var f1 = container.GetInstance<IMyService>();
var f2 = container.GetInstance<IMyService>();
Assert.IsTrue(f1 != f2);
使用我们的自定义约定几乎可以实现相同的目标:
public class MyConvention : DefaultConventionScanner
{
public override void Process(Type type, Registry registry)
{
base.Process(type, registry);
// here we shold do some evaluation what to map
// for example
// just classes wich are not abstract
var skipType = type.IsAbstract
|| !type.IsClass;
if (skipType)
{
return;
}
// here we do the magic
// register each type with transient Lifecycle
registry.For(type)
.LifecycleIs(new StructureMap.Pipeline.TransientLifecycle())
.Use(type);
}
}
这可以像这样使用来获得相同的结果
var container = new Container(x =>
{
x.Scan(s =>
{
s.AssemblyContainingType<MyService>();
s.Convention<MyConvention>();
});
}
var f1 = container.GetInstance<MyService>();
var f2 = container.GetInstance<MyService>();
Assert.IsTrue(f1 != f2);