3

MVCwebApiUnityで動作するアプリケーションがあります。私はシングルトンクラス(DelegateHandler)にインターフェイスITestを解決する必要があります。しかし、インターフェースITestにはhttprequestのライフタイムマネージャがあり、重要です。だから私はApplication_StartイベントでITestを解決することはできません。なぜなら、HttpRequestは今はないからです。しかし、DelegateHandlerは、httprequestライフサイクルでのみITestを使用します。ユニティ遅延解決

DelegateHandlerへの遅延解決を送信することは可能でしょうか、他の面白い解決策があるかもしれませんか?

答えて

2

持っている(DelegateHandler私は仮定)を使用すると、一般的にパーHTTPリクエストまたは過渡としてITestを登録しますので、それが不可能な場合は、依存関係をラップサービスの寿命は常に、同等またはその依存関係のそれよりも短くする必要がありますプロキシでのあたりのHTTPリクエスト寿命:

public class Foo 
{ 
    Func<IEnumerable<ITest>> _resolutionFunc; 
    ITest _test; 
    public Foo(Func<IEnumerable<ITest>> resolutionFunc) 
    { 
     _resolutionFunc=resolutionFunc; 
    } 

private void ResolveFuncToInstance() 
{ 
    _test=_resolutionFunc().First(); 
} 
} 

私たちがやっていることは、すべてのたITestを解決しますデリゲートをご提供するためにUnityに求めている:

// Proxy 
public class DelegateHandlerProxy : IDelegateHandler 
{ 
    public Container Container { get; set; } 

    // IDelegateHandler implementation 
    void IDelegateHandler.Handle() 
    { 
     // Forward to the real thing by resolving it on each call. 
     this.Container.Resolve<RealDelegateHandler>().Handle(); 
    } 
} 

// Registration 
container.Register<IDelegateHandler>(new InjectionFactory(
    c => new DelegateHandlerProxy { Container = c })); 
+0

ありがとう、非常に良い答え! –

+0

一般的なソリューションに変換するのはクールですが、それは不可能です) –

0

別のオプションは、次の操作を実行することですスタンコンテナ内のces。これはFuncなので、Unityからの実際の解決をしたいときはいつでも呼び出すことができます。

これはStevenが行っているのと同じことですが、私たちが探していることを行うためにinbuilt Unity機能を使用しています。