3

MVC webApi動作するアプリケーションがありますUnity。インターフェイスITestをシングルトンクラス(DelegateHandler)に解決する必要があります。ただし、インターフェイスITestにはhttprequestライフタイムマネージャーごとにあり、重要です。したがって、現在HttpRequestがないため、イベントでITestを解決できませんApplication_Startが、DelegateHandlerはhttprequestライフサイクルでのみITestを使用します。

では、怠惰な解決策をDelegateHandlerに送信することは可能ですか、それとも誰かが他の興味深い解決策を持っている可能性がありますか?

4

2 に答える 2

2

サービスの有効期間は常に依存関係の有効期間と同じかそれより短い必要があるため、通常はHTTPリクエストごとまたは一時的なものとして登録しますが、それが不可能な場合は、Httpリクエストごとの有効期間を持つ依存関係(私が推測する)を次ITestのようにラップします。DelegateHandlerプロキシ:

// 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 }));
于 2012-04-05T09:49:54.400 に答える
0

別のオプションは、次のことを行うことです。

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に依頼することです。これはFuncであるため、Unityから実際の解決を実行したいときはいつでも呼び出すことができます。

これはStevenが行っていることとほとんど同じですが、組み込みのUnity機能を使用して私たちが探していることを実行します。

于 2012-11-15T15:41:26.040 に答える