为什么这个方法调用没有被截获?

时间:2009-11-04 18:57:37

标签: c# inversion-of-control unity-container aop ioc-container

为什么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);
        }

    }

}

1 个答案:

答案 0 :(得分:2)

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