对于未注册的具体类型,默认为“始终唯一”

时间:2015-06-07 13:16:53

标签: c# inversion-of-control structuremap structuremap3

考虑这段代码

GetInstance

我不想注册每个可以注入的具体类型,但是我希望它们对于每个构造函数注入都是唯一的,或者调用{{1}}

更新:

嗯,我必须使用NestedContainers错了吗?我想要的是为程序的子部分创建一个“Sub”容器(它是一个WPF客户端,所以子部分可以是一个像弹出窗口或其他的子模型)。子模型可以有自己的子模型或服务,它们可以是混凝土,也可以不是已注册的或者是已登记的。我根本不想注册的具体类型。我希望接口默认为Structuremap所谓的AlwaysUnique,但在我的世界里,这就是瞬态生命周期。对于99.9%的我的类型,我想要AlwaysUnique和0.01%我想在嵌套容器的生命周期中使用相同的引用。也许这个用例对嵌套容器不正确?

编辑:典型的用例是仅在程序的一部分中进行事件聚合,如弹出模型及其子项

1 个答案:

答案 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);