0

考虑这段代码

var container = new Container();
var nested = container.GetNestedContainer();

var f1 = nested.GetInstance<Foo>();
var f2 = nested.GetInstance<Foo>();

var result = f1 == f2; //I want result to be false

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

更新:

嗯,我一定是用错了 NestedContainers?我想做的是为程序的子部分创建一个“子”容器(它是一个 WPF 客户端,因此子部分可以是一个子模型,如弹出窗口或其他)。子模型可以有自己的子模型或服务,它们可以是具体的且未注册的,也可以是已注册的 intarfaced。我根本不想注册的具体类型。我想默认使用 Structuremap 称为 AlwaysUnique 的接口,但在我的世界里,这就是瞬态生命周期。对于 99.9% 的类型,我想要 AlwaysUnique,0.01% 我想要在嵌套容器的生命周期内使用相同的引用。也许这个用例不适用于嵌套容器?

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

4

1 回答 1

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);
于 2015-06-09T16:45:53.213 回答