Почему вызов этого метода не перехватывается?

Asked
Viewd602

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

    }

}
 

1 ответов

2

Вам нужно применить атрибут [Test] к ILogger.Write вместо DoIt.Способ работы перехвата заключается в создании прозрачного прокси, который затем передает управление любым обработчикам до целевого метода.Проблема с вашей текущей настройкой заключается в том, что DoIt вызывается самим экземпляром регистратора, поэтому прокси-сервер не может перехватить вызов.Другими словами, вы можете перехватывать методы, вызываемые непосредственно в интерфейсе, только при использовании перехвата.

  • Могу ли я сделать это с помощью перехвата экземпляров или типов?Потому что мне нужно перехватить метод, который вызывается самим интерфейсом, как в примере.

    subjective-c04 ноября 2009, 19:32
  • Да, возможно, у вас получится сделать Logger.DoIt виртуальным и создать в Logger интрацептор экземпляра.Я думаю, что у Unity могли быть проблемы с такими вложенными прокси, но версия 2.0 могла это исправить…

    Lee04 ноября 2009, 20:19