0

これは、LightInject の傍受に固有のものです。ユーザー入力に基づいて傍受ロジックを条件付きでオン/オフできるように、PerWebRequest の有効期間に基づいて傍受ロジックを適用することは可能ですか? たとえば、このようなもの。

    public static void Configure()
    {
        var serviceContainer = new ServiceContainer();
        serviceContainer.EnablePerWebRequestScope();
        serviceContainer.Register<ITraceSwitcher, TraceSwitcher>(new PerScopeLifetime());
        serviceContainer.Register<IMyService, MyService>(new PerScopeLifetime());
        serviceContainer.Intercept(x => x.ServiceType == typeof(IMyService), (y, z) => DefineProxyType(z, IsTracingEnabled));

        ServiceLocator.SetLocatorProvider(() => new LightInjectServiceLocator(serviceContainer));
    }

    private static void DefineProxyType(ProxyDefinition proxyDefinition, Func<bool> isTracingEnabled)
    {
        if (isTracingEnabled())
            proxyDefinition.Implement(() => new MyServiceInterceptor(), m => m.Name == "SomeMethod");
    }

    private static bool IsTracingEnabled()
    {
        var traceSwitcher = ServiceLocator.Current.GetInstance<ITraceSwitcher>();
        return traceSwitcher.IsTracingEnabled();
    }

IMyService の有効期間は PerWebRequest として定義されているため、すべての Web 要求に対して作成され、MyService インスタンスを作成するたびに Intercept メソッドを呼び出して、トレースが有効かどうかに応じてインターセプト ロジックを適用することを動的に決定できるという印象を受けました。ユーザーによって無効にされました。ただし、IMyService インスタンスが要求されたときに初めて Intercept メソッドを呼び出し、その後のすべての要求で同じ Interception メカニズムを再利用するようです。

また、MyServiceInterceptor 内で ITraceSwitcher ロジックを使用して、そこで傍受ロジックを使用またはバイパスすることもできますが、リフレクションによるプロキシ呼び出しのオーバーヘッドを回避するためにトレースが無効になっている場合は、プロキシの作成を避けたいと考えていますが、これは Intercept の場合にのみ可能です。メソッドは、Web リクエストごとに呼び出されます。それが可能か、またはより良い方法があるかどうか教えてください。

ありがとう、

サイド・デンマーク。

4

1 に答える 1

3

IsTracingEnabled メソッド呼び出しを、サービスをインターセプトする必要があるかどうかを決定する述語に直接入れることができます。プロキシ タイプは、述語に一致する場合にのみ作成されます。

using LightInject;
using LightInject.Interception;

class Program
{
    static void Main(string[] args)
    {

        var container = new ServiceContainer();
        container.Register<IFoo, Foo>();
        container.Intercept(sr => sr.ServiceType == typeof(IFoo) && IsTracingEnabled(), (factory, definition) => DefineProxyType(definition));

        var foo = container.GetInstance<IFoo>();
    }

    private static void DefineProxyType(ProxyDefinition proxyDefinition)
    {            
        proxyDefinition.Implement(() => new SampleInterceptor(), m => m.Name == "SomeMethod");
    }

    private static bool IsTracingEnabled()
    {
        return true;
    }
}

public class SampleInterceptor : IInterceptor
{
    public object Invoke(IInvocationInfo invocationInfo)
    {
        return invocationInfo.Proceed();
    }
}

public interface IFoo { }

public class Foo : IFoo { }

よろしくお願いします

ベルンハルト・リヒター

于 2014-07-31T17:24:56.693 に答える