#.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());