2

私の [Webmethod] には、このようなコードがあります。

var something = container.ResolveSomething();
something.Run();

1 つを除くすべての登録済みコンポーネントには、ライフスタイルが PerWebRequest として定義されています。1 つはシングルトン (ロガー) として登録されます。一部のコンポーネントについては、メソッド呼び出しとその結果をログに記録する Interceptor を定義および構成しました。

私の質問は、この Interceptor を Lifestyle PerWebRequest に登録すると問題が発生しますか? すべてのインターセプターをトランジェントにし、本当にやりたいと確信している場合は他のライフスタイルを使用するためのドキュメントのアドバイス。Interceptors をライフスタイル Transient に登録すると、約 100 のメソッドのいずれかが次のようになります。

IComponent component = null;
try
{
    component = container.ResolveComponent();
    compoment.Run();
}
finally
{
    container.Release(component);
}
したがって、実際のコードよりもボイラープレートが多くなります。

これが私のインターセプターです:

public class LoggingInterceptor : IInterceptor
{
    private readonly ILogger logger;

    public LoggingInterceptor(ILogger logger)
    {
        this.logger = logger;
    }

    public void Intercept(IInvocation invocation)
    {
        var call = string.Format("{0}.{1}({2})", invocation.TargetType.FullName, invocation.Method.Name, string.Join(", ", invocation.Arguments.Select(arg => arg.ToString()).ToArray()));

        try
        {
            logger.Info(call);
            invocation.Proceed();

            logger.Info("Result: " + call + " = " + invocation.ReturnValue);
        }
        catch (Exception e)
        {
            logger.Error(call, e);
            throw;
        }
    }
}

WCF の方が IoC に適していることはわかっていますが、ASP.NET WebServices にとどまらなければなりません。

4

1 に答える 1

4

私の理解では、インターセプターが一時的であっても、その寿命は傍受されたコンポーネントに拘束されています。コンテナで追跡されるため、傍受されたコンポーネントでリリースされます。

于 2013-01-15T13:23:50.980 に答える