2011-01-20 11 views
3

これをどのように説明するのかよく分かりませんが、ここにはあります。ユニティとライフタイムの管理

私は4つのクラスを持っています:A、B、C、D。

は、AはB、C、D
を注射されたCはD

Aが解決あたりであると注入されます。
Bはシングルトンです。
CとDわかりません。

IはA及びCは、Iが容器から解決するので、各時間Dの同じインスタンスを使用する場合、Dは

を一度作成し、AとCの両方に注入しなければならない最も簡単な方法は、になるであろうmakeはAをUnityを使わずにDからCに渡すだけです。しかし、Unityでこれを行う方法はありますか?私はContainerControlledLifetimeManagerとPerResolveLifetimeManagerを使用していて、子コンテナは使用していません。これは役に立つと思われます。私はこれで少し演奏しているが、それはかなり乱雑になる。それは簡単にできますか?

答えて

10

操作している文脈が大きくなっていますか? ASP.NETでは、単一のHTTP要求中に複数回要求されたときに同じオブジェクトを返すPerRequestLifetimeManagerを作成しました。

編集:興味がある場合はここに実装があります。だから、

public class PerRequestLifetimeManager : LifetimeManager 
{ 
    private readonly object key = new object(); 

    public override object GetValue() 
    { 
     if (HttpContext.Current != null && HttpContext.Current.Items.Contains(key)) 
      return HttpContext.Current.Items[key]; 
     else 
      return null; 
    } 

    public override void RemoveValue() 
    { 
     if (HttpContext.Current != null) 
      HttpContext.Current.Items.Remove(key); 
    } 

    public override void SetValue(object newValue) 
    { 
     if (HttpContext.Current != null) 
      HttpContext.Current.Items[key] = newValue; 
    } 
+0

ありHTTPセッションのような明白な1ではありませんが、私はものを作ることができると思います。しかし、それは何ですか?どのオブジェクトにPerRequestLifetimeManagerを割り当てる必要がありますか?私がそれをDに割り当てるのは明らかですが、Bはそれがシングルトンなので新しいものを得られません。私はまたBを変えるべきですか?多くの依存関係が存在する大きなアプリケーションでは、どのタイプをPerRequestLifetimeManagerにするかを手動で決定するのが難しくなります。どのように動作するかについてもう少し詳しく教えてください。それは良いアイデアのようですが、私はそれを完全に理解していません。 – Karsten

+0

私はDが1リクエストにつき解決すると考えていました。あなたのシナリオは、BがDへの参照を保持していることを示していません。そうした場合、BはDのインスタンスを1つしか持てません(Dもシングルトンでない限り)。あなたのシナリオは抽象的に解決するには複雑すぎるかもしれません。 A、B、C、Dの基本機能をいくつか指定しておけば、もっと良い光を放つことができるかもしれません。 –

+0

ありがとうございます。この生涯マネージャを使用するタイプ/インスタンスを決定するにはどうすればよいですか?すべての登録にそれを使用しますか? – Karsten

0

、あなたはAが解決されたとき& Cとの間にDを共有したいです。何か他のことが解決されたらどうですか?

これはContainerControlledLifetimeManagerの "D everywhere"の単なるインスタンスの場合です。

この特定のインスタンスでのみDを共有する場合は、必要なセマンティクスに応じて、Dに名前とPerResolveまたはContainerControlledを登録できます。次に、A & Cを設定するときは、その特定の名前のDを入力します。

それ以外の場合は、詳細が必要です。

おそらく、この子コンテナの子コンテナに入る必要はありません。

+0

Aが解決されるたびにDになるので、ContainerControlledLifetimeManagerは機能しません。 – Karsten

0

あなたはMVC3を使用している場合は、Unity.Mvc3 http://unitymvc3.codeplex.comを見てとることができ、サイト上の

説明は「このプロジェクトは含まASP.NET MVC 3とMicrosoftのユニティIoCコンテナの簡単な統合を可能にするライブラリを語ります個別のDependencyResolverは、HTTPリクエストごとに子コンテナを作成し、リクエストの最後に登録されたすべてのIDisposableインスタンスを破棄します。

使用http://www.devtrends.co.uk/blog/integrating-the-unity.mvc3-1.1-nuget-package-from-scratch

関連する問題