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

发布于 2024-08-10 05:25:40 字数 1619 浏览 6 评论 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);
        }

    }

}

Why doesn't DoIt() method call get intercepted? Should I use something other than InterfaceInterceptor to intercept the DoIt() method? How would you do it?

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);
        }

    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白首有我共你 2024-08-17 05:25:40

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

You need to apply the [Test] attribute to ILogger.Write instead of DoIt. The way interception works is to create a transparent proxy which then passes control to any handlers before the target method. The problem with your current setup is that DoIt is called by the logger instance itself, so there is no way for the proxy to intercept the call. In other words, you can only intercept methods called directly on an interface when using interception.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文