2009-11-04 114 views
0

为什么DoIt()方法调用被拦截?我应该使用InterfaceInterceptor以外的其他方法来拦截DoIt()方法吗?你会怎么做?为什么这个方法调用不被拦截?

using System; 
using Microsoft.Practices.Unity; 
using Microsoft.Practices.Unity.InterceptionExtension; 

namespace UnityTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IUnityContainer container = new UnityContainer(); 
      container.AddNewExtension<Interception>(); 
      container.RegisterType<ILogger, Logger>(); 
      container.Configure<Interception>().SetInterceptorFor<ILogger>(new InterfaceInterceptor()); 

      var logger = container.Resolve<ILogger>(); 
      logger.Write("World."); 
      Console.ReadKey(); 

     } 
    } 

    public interface ILogger 
    { 
     void Write(string message); 

     [Test] 
     void DoIt(string message); 
    } 


    public class Logger : ILogger 
    { 
     public void Write(string message) 
     { 
      DoIt(message); 
     } 

     public void DoIt(string message) 
     { 
      Console.Write(message); 
     } 
    } 

    public class TestAttribute : HandlerAttribute 
    { 

     public override ICallHandler CreateHandler(IUnityContainer container) 
     { 
      return new TestHandler(); 
     } 

    } 

    public class TestHandler : ICallHandler 
    { 

     public int Order { get; set; } 

     public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
     { 

      Console.Write("Hello, "); 
      return getNext()(input, getNext); 
     } 

    } 

} 

回答

2

您需要将[Test]属性应用于ILogger.Write而不是DoIt。截取工作的方式是创建一个透明代理,然后在目标方法之前将控制权传递给任何处理程序。当前设置的问题是DoIt被记录器实例本身调用,所以代理无法拦截该调用。换句话说,您只能截取在使用截取时直接在接口上调用的方法。

+0

我可以用Instance或Type拦截吗?因为我需要拦截一个被接口本身调用的方法,就像它的例子。 – 2009-11-04 19:32:37

+0

是的,您可能会使Logger.DoIt虚拟并在Logger上创建一个实例inteceptor。我认为Unity可能会遇到类似嵌套代理的问题,但2.0可能已经修复了它... – Lee 2009-11-04 20:19:04