2017-11-23 14 views
0

は私が持っている場合:Unity - 条件付きで子スコープを作成するにはどうすればいいですか?

container.RegisterType<ICalculationBuilder, CalculationBuilder>(); 

私は新しいインスタンス私はICalculationBuilderを解決するたびに取得します知っています。

私は、Ifが行うことを知っている:

var childContainer = container.CreateChildContainer(); 

childContainer.RegisterType<ICalculationBuilder, CalculationBuilder>(new HierarchicalLifetimeManager()); 

その後、私は同じインスタンス私はその子の範囲内ICalculationBuilderを解決するたびに取得します。

しかし、与えられた:

class CalculationBuilder 
{ 
    CalculationBuilder(int year) 
    { 
    } 
} 

はどのようにして各年のCalculationBuilderの別のインスタンスを取得することができますか?私が行うので、もし:次に

var builder1 = childContainer.Resolve(typeof(ICalculationBuilder), new DependencyOverride<int>(2017)); 

var builder2 = childContainer.Resolve(typeof(ICalculationBuilder), new DependencyOverride<int>(2017)); 

var builder3 = childContainer.Resolve(typeof(ICalculationBuilder), new DependencyOverride<int>(2018)); 

Assert.Same(builder1, builder2) would be true 

Assert.NotSame(builder2, builder3) would be false 
+0

計算自体にとって年が重要なのであれば、あなたが作成しているものを作成するために呼び出す方法の一部にする必要があります。 – Icepickle

+0

ありがとうございます。残念ながらそれは不可能です。計算は年ごとに変わることはありません。計算ビルダは計算Aを構築し、次に計算Bを呼び出して計算Bを構築することができる。年は、計算の特定のバージョンがあるかもしれないので、ビルダーに渡されます。B - >計算B2017。 – Adam

答えて

1

を私が思うに、あなたはあなたのオブジェクトを管理するために、工場のいくつかの並べ替えを作成することができます。

class CalculationFactory : IDisposable 
{ 
    private readonly Dictionary<int, CalculationBuilder> cache = new Dictionary<int, CalculationBuilder>(); 
    private readonly IUnityContainer container; 

    public ICalculationBuilder Get(int year) 
    { 
     if (!cache.ContainsKey(year)) 
     { 
      cache[year] = container.Resolve(typeof(ICalculationBuilder), new DependencyOverride<int>(year)); 
     } 

     return cache[year]; 
    } 

    public void Dispose() 
    { 
     cache.Clear(); 
    } 
} 

このクラスを介してのみオブジェクトを作成します。それは毎年の苦情をキャッシュします。

+0

@Adamこの回答を受け入れることができますか、または詳細情報が必要ですか? – Backs

関連する問題