1

Castle Dynamic Proxy が明示的なインターフェイス実装であるメソッドをインターセプトするのに問題があります。私はここでhttp://kozmic.pl/category/dynamicproxy/を読んで、これを行うことができるはずです。これが私のクラスです。

internal interface IDomainInterface
{
    string DomainMethod();
}

public class DomainClass : IDomainInterface
{
    string IDomainInterface.DomainMethod()
    {
        return "not intercepted";
    }
}

これが私のインターセプタークラスです。

public class DomainClassInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        if (invocation.Method.Name == "DomainMethod")
            invocation.ReturnValue = "intercepted";
        else
            invocation.Proceed();
    }
}

そして、これが私のテストです(失敗します)。

    [TestClass]
    public void can_intercept_explicit_interface_implementation()
    {
        // Create proxy
        var generator = new ProxyGenerator();
        var interceptor = new DomainClassInterceptor();
        var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), interceptor);

        // Invoke proxy method
        var result = proxy.DomainMethod();

        // Check method was intercepted -- fails
        Assert.AreEqual("intercepted", result);
    }

明示的なインターフェイスの実装をインターセプトできないことに加えて、プロキシできないメンバーの通知を受け取っていないようです。これが私のプロキシ生成フックです(スパイとして機能します)。

public class DomainClassProxyGenerationHook : IProxyGenerationHook
{
    public int NonProxyableCount;

    public void MethodsInspected() {}

    public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo)
    {
        NonProxyableCount++;
    }

    public bool ShouldInterceptMethod(Type type, MethodInfo methodInfo)
    {
        return true;
    }
}

これが私のテストです(これも失敗します)。

    [TestMethod] 
    public void receive_notification_of_nonproxyable_explicit_interface_implementation()
    {
        // Create proxy with generation hook
        var hook = new DomainClassProxyGenerationHook();
        var options = new ProxyGenerationOptions(hook);
        var generator = new ProxyGenerator();
        var interceptor = new DomainClassInterceptor();
        var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), options, interceptor);

        // Check that non-proxyable member notification was received -- fails
        Assert.IsTrue(hook.NonProxyableCount > 0);
    }

明示的なインターフェイスの実装をインターセプトするために DP を取得することに成功した人はいますか? もしそうなら、どのように?

4

1 に答える 1

4

クラス プロキシを作成しています。クラス プロキシは、クラスの仮想メソッドのみをインターセプトします。C# でのインターフェイス メソッドの明示的な実装は、定義上、仮想ではありません (プライベートであるため)。

インターフェイスのメソッドをインターセプトしたい場合は、それについて DynamicProxy に明示的に伝える必要があります

var proxy = (IDomainInterface)generator.CreateClassProxy(typeof(DomainClass), new Type[] { typeof(IDomainInterface) }, interceptor);

また、インターフェースはDynamicProxy用internalであることを確認したようにマークされてpublicいます(インターフェースを公開するか追加しますInternalsVisibleToAttribute)。

これで、最初のテストに合格し、メソッドがインターセプトされます。

于 2012-05-27T10:39:02.573 に答える