1

私は次の設定をしています

public class CommonClass : ICommonClass
{
}

public class SomeClass : ISomeClass
{
   public SomeClass(ICommonClass common, IOtherClass otherClass) {}
}

public class OtherClass : IOtherClass
{
  public OtherClass(ICommonClass common) {}
}

//Registration
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();
builder.RegisterType<SomeClass>().As<ISomeClass>().InstancePerDependency();
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();

各コンストラクターの共通引数を同じインスタンスにしたいのですが、SomeClassが解決されたときにICommonの新しいインスタンスを作成します。どうすればこの時間を実現できますか。それらをInstancePerLifetimeScopeとして登録しようとしましたが、SingleInstanceと同じように機能しました。

4

2 に答える 2

0

InstancePerDependency依存関係ごとに新しいインスタンスが必要な場合に使用する方法です。現在、従属クラスごとにライフタイムを変えるのは難しいことであり、正しくないと感じています。この動作が必要な理由を詳しく説明できれば、おそらくより良い方法が見つかるでしょう。

そうは言っても、あなたが求めることを達成するために(私はそれが好きではありませんが;)、あなたは「インスタンスホルダー」を利用することができます。私の考えでは、通常の依存関係では、新しい共通インスタンスが通常どおり提供されます。ただし、特殊なケースSomeClassでは、共通インスタンスは、常に同じインスタンスを提供するこのホルダークラスからフェッチされます。

public class CommonHolder
{
    public ICommonClass Instance {get;private set;}
    public CommonHolder(ICommonClass commonInstance)
    {
        Instance = commonInstance;
    }
}

次に、登録の設定:

builder.RegisterType<CommonHolder>().SingleInstance();
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();

builder.RegisterType<SomeClass>().InstancePerDependency();
builder.Register(c =>
    c.Resolve<SomeClass>(TypedParameter.From(c.Resolve<CommonHolder>().Instance)))
    .As<ISomeClass>().InstancePerDependency();
于 2010-07-27T20:02:03.080 に答える
0

の個別の名前付き登録を作成し、ICommonClassそれを解決するときにのみ使用できSomeClassます。

// Existing registration
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency();

// One-off registration
builder
    .RegisterType<CommonClass>()
    .As<ICommonClass>()
    .InstancePerLifetimeScope()
    .Named<ICommonClass>("OneOffCommonClass");

// New registrations of dependents
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency();

builder
    .Register(c => new SomeClass(
        c.Resolve<ICommonClass>("OneOffCommonClass"),
        c.Resolve<IOtherClass>()))
    .As<ISomeClass>()
    .InstancePerDependency();
于 2010-07-28T19:42:58.540 に答える