Hi Krzysztof, thanks for lending a hand. Here's a quick snippet of the
failing test along with console output.

*************
  class Program
  {
    static void Main(string[] args)
    {
      var tb = new TestB();

      Type[] interfaces = tb.GetType().GetInterfaces();

      var factory = new ProxyFactory();

      var proxy =
factory.CreateInterfaceProxyWithTarget<IInterfaceB>(tb, new[]
{ InterceptorType.Validator },
 
ProxyGenerationHookType.Selective, interfaces);

      ((IInterfaceA)proxy).TestA1();
      ((IInterfaceA)proxy).TestA2();
      ((IInterfaceB)proxy).TestB1();
      ((IInterfaceB)proxy).TestB2();

      ((ICommon)proxy).Common1();

      // Stepping in will not go anywhere. The target method is never
reached since there's no console output.
      ((ICommon)proxy).Common2();
    }
  }

  public interface ICommon
  {
    void Common1();

    [NonProxied]  // This one doesn't work, it doesn't seem to do
anything for the call.
    void Common2();
  }

  public interface IInterfaceA
  {
    void TestA1();

    void TestA2();
  }

  public interface IInterfaceB
  {
    void TestB1();

    [NonProxied]  // This one works, the call to TestB2 is not
intercepted but reaches target.
    void TestB2();
  }

  public abstract class TestA : IInterfaceA, ICommon
  {
    void ICommon.Common1()
    {
      Console.WriteLine(" - Reached target Common1()\n");
    }

    void ICommon.Common2()
    {
      Console.WriteLine(" - Reached target Common2()\n");
    }

    void IInterfaceA.TestA1()
    {
      Console.WriteLine(" - Reached target TestA1()\n");
    }

    void IInterfaceA.TestA2()
    {
      Console.WriteLine(" - Reached target TestA2()\n");
    }
  }

  public class TestB : TestA, IInterfaceB
  {
    void IInterfaceB.TestB1()
    {
      Console.WriteLine(" - Reached target TestB1()\n");
    }

    void IInterfaceB.TestB2()
    {
      Console.WriteLine(" - Reached target TestB2()\n");
    }
  }

  public class ActiveObjectInterceptor : StandardInterceptor
  {
    protected override void PerformProceed(IInvocation invocation)
    {
      Console.WriteLine(String.Format("Intercepted call to {0}\n",
invocation.Method.Name));
      base.PerformProceed(invocation);
    }
  }

  public class NonProxiedGenerationHook : ProxyGenerationHookBase
  {
    public override bool ShouldInterceptMethod(Type type, MethodInfo
methodInfo)
    {
      bool intercept = true;

      if (methodInfo.IsDefined(typeof(NonProxiedAttribute), true))
      {
        intercept = false;
      }

      return intercept;
    }

    #region Equality
    ...
    #endregion
  }
***************

Output:

Intercepted call to TestA1

 - Reached target TestA1()

Intercepted call to TestA2

 - Reached target TestA2()

Intercepted call to TestB1

 - Reached target TestB1()

 - Reached target TestB2()

Intercepted call to Common1

 - Reached target Common1()

*********************

As you can see, I expected to see the line "- Reached target
Common2()" without the line "Intercepted call to Common2()" much like
the non-proxied call to TestB2(). I made sure the supplied list of
additional interfaces to proxy does include ICommon.

Thanks


On Sep 23, 8:19 pm, Krzysztof Koźmic <[email protected]>
wrote:
> can you provide a failing test?
>
> I'm not sure I understand the scenario 2 here
>
> 2010/9/24 Kam <[email protected]>
>
> > Hi,
>
> > I'm currently using IProxyGenerationHook to control which methods to
> > exclude for proxy generation for a given interface. My current
> > hierarchy of classes and interfaces is the following:
>
> > Class_A implements interfaces Interface_A and Interface_Z
> > Class_B inherits Class_A and also implements interfaces Interface_B
> > Interface_B inherits Interface_Z.
>
> > I created a proxy to interface Interface_B with a target instance of
> > Class_B, and gave it Interface_Z as additional interface to include in
> > the proxy generation process.
>
> > I use custom attributes on methods/properties to mark for exclusion.
> > i.e. [NonProxied].
>
> > Scenario 1:
> > If I mark a method belonging to Interface_B, the hook will exclude it
> > and any calls through the proxy to that marked method will reach the
> > target object's method without interception. (Behaviour I expected).
>
> > Scenario 2:
> > If I mark a method belonging to Interface_Z and cast my proxy instance
> > to (Interface_Z) to make a call to the marked method, the call will
> > not reach its target object. From a debugger point of view, attempting
> > to step-in won't do anything. The execution proceeds to the next line
> > without interception nor forwarding to the real implementation. I get
> > this behaviour even without attaching the debugger. (Expected the call
> > to reach the target instance's method implementation without
> > interceptors).
>
> > To summarize, using proxy generation hook to exclude seems to work
> > only for first level interface methods and properties but not for
> > inherited interfaces with marked methods or properties.
>
> > Perhaps this is not supported or I'm just missing something? Has
> > anyone else experienced a similar scenario?
>
> > Thanks in advance!
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "Castle Project Users" group.
> > To post to this group, send email to [email protected]
> > .
> > To unsubscribe from this group, send email to
> > [email protected]<castle-project-users%[email protected]>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/castle-project-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en.

Reply via email to