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クライアントなので、サブ部分はポップアップなどのサブモデルになる可能性があります)。サブモデルは、独自のサブモデルまたはサービスを持つことができます。これらは、Concrete で登録されていないか、または登録されているインターフェイスのいずれかです。まったく登録したくない具体的な型。そして、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 に答える