0

Unityで次のことをどのように行うのだろうか....

オブジェクトが「リクエストごと」に作成される簡単なコードがあります。ほとんどの場合、インジェクション ファクトリを使用して (リクエストごとに) ILogger インスタンスを構築します...次のように...

container.RegisterType<ILogger>(new InjectionFactory( factory => factory.Resolve<ILoggingFactory>() ));

これまでのところ非常に単純です...しかし、単一のWebリクエストで複数のオブジェクトへの複数の呼び出しがあると想像してください.存在する....次のように

// This should use the RegisterType functionality (above) to create a new instance of the logger
public class A : IAIntf
{
    public AConstructor(ILogger log)
    { .. }
}

// This should use the logger which was constructed when A was created
public class B : IBIntf
{
    public BConstructor(ILogger log)
    { .. }
}

このコードは、クラス A のインターフェイスを正しく作成しますが、..

unity.GetService(typeof(T)); // Unity thinks T is IBIntf (which is correct)

.. しかし解決の間、Unity はクラス A がインスタンス化されたときに作成された ILogger クラスの再利用に失敗します。

問題は、Unity が ILogger インターフェイスのライフタイムを維持する必要があることだと思うので、コンテナーの登録を次のように調整しましたが、新しい ILogger が作成されます:(

container.RegisterType<ILogger>(new HttpRequestLifetimeManager<ILogger>(), 
    new InjectionFactory( factory => factory.Resolve<ILoggingFactory>() ));

// Also tried
container.RegisterType<ILogger>(new PerResolveLifetimeManager(), 
    new InjectionFactory( factory => factory.Resolve<ILoggingFactory>() ));

新しい ILogger インスタンスを作成する代わりに、クラス A にも渡された ILogger インターフェイスを再利用して、クラス B の新しいインスタンスを提供するようにユニティに指示するにはどうすればよいですか?

4

1 に答える 1

0

私はこれを解決できたと思います-私の問題は、HttpContext.Currentがクラスライブラリ内にあるため、適切に解決されないようであり、代わりにcallcontextを使用すると問題が解決するように見えることだと思います。

于 2013-04-24T10:30:36.830 に答える