Конфигурация перехвата / ведения журнала на основе кода для Unity

#.net #logging #unity-container #ioc-container #unity-interception

#.net #протоколирование #unity-контейнер #ioc-контейнер #unity-перехват

Вопрос:

Я использую Unity в качестве контейнера IoC, который пока работает нормально. Теперь я хотел бы использовать перехват с TypeMatchingRule и LogCallHandler для регистрации всех вызовов интерфейса IMyInterface. Я настраиваю unity с помощью кода, но не могу заставить ведение журнала работать. Может ли кто-нибудь указать мне на простой пример? Я нашел довольно много небольших фрагментов в документации, но я не могу создать рабочую конфигурацию для своего варианта использования. Похоже, я упускаю общую картину!?

Комментарии:

1. Я использую версию Unity, которая поставляется с Enterprise Library 5.0

2. Я нашел это руководство по шаблонам и практикам очень полезным: msdn.microsoft.com/en-us/library/dn178466.aspx

Ответ №1:

Прежде всего, создайте поведение. Вот пример:

 public class MyLoggerBehavior : IInterceptionBehavior
  {
    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
      var returnValue = getNext()(input, getNext);

      if (returnValue.Exception != null)
      {
        Global.Logger.TraceException("Exception intercepted", returnValue.Exception);
      }
      else
      {
        Global.Logger.Trace("Method {0} returned {1}", input.MethodBase, returnValue.ReturnValue);
      }
      return returnValue;
    }

    public IEnumerable<Type> GetRequiredInterfaces()
    {
      return new Type[0];
    }

    public bool WillExecute
    {
      get { return Global.Logger.IsTraceEnabled; }
    }
  }
  

затем зарегистрируйте его:

 Container
        .AddNewExtension<Interception>()
        .RegisterType<IDao, NhDao>(new Interceptor(new InterfaceInterceptor()),
                new InterceptionBehavior(new MyLoggerBehavior())
        );
  

Он будет отслеживать каждый вызов в регистраторе

Комментарии:

1. Это направление, которое я ищу, но я хотел бы использовать блок ведения журнала Enterprise Library 5.0, в котором уже есть все необходимые классы. Мои вопросы направлены на получение ваших результатов с помощью встроенных классов.

Ответ №2:

Если вы хотите добавить добавить обработчик вызовов к регистрации перехвата, вам нужно сделать что-то вроде этого (я попытался сделать имена переменных понятными):

 var intp = m_singleInstance.Configure<Interception>()
    .SetInterceptorFor(typeof(typeToIntercept), 
        new TransparentProxyInterceptor());

var policy = intp.AddPolicy(policyNameString);

policy.AddMatchingRule<TypeMatchingRule>(
    new InjectionConstructor(
    new InjectionParameter(typeof(typeToIntercept))))
    .AddCallHandler(typeof(LogCallHandler), 
        new ContainerControlledLifetimeManager());