Во-первых, я никогда раньше не использовал Unity... Я хочу внедрить Tracing/Logging в наш проект через перехват единства.
Проект довольно большой (~30000 файлов). Цель состоит в том, чтобы отслеживать производительность/период выполнения каждый раз, когда мы пытаемся вызвать внешний сервис. К сожалению, я не могу использовать никакую другую библиотеку.
Чтобы ознакомиться с тем, как эта концепция будет работать, я создал небольшую программу, которую нашел в MSDN; однако мой перехват с атрибутом журнала по-прежнему не срабатывает. Я уверен, что мне не хватает какой-то конфигурации или/и инициализации. Я ценю любую помощь.
Вот моя основная программа:
namespace calc
{
class Program
{
static void Main(string[] args)
{
try
{
var t = new calc.Calculator.Calculator().Sub(5, 8);
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
}
}
Вот класс калькулятора:
namespace calc.Calculator
{
public interface ICalculator
{
Int32 Sum(Int32 x, Int32 y);
Int32 Sub(Int32 x, Int32 y);
}
public class Calculator : ICalculator
{
public Int32 Sum(Int32 x, Int32 y)
{
return x + y;
}
[NonNegativeCallHandler] // Intercept this method and run tracing on it
public Int32 Sub(Int32 x, Int32 y)
{
return x - y;
}
}
}
Вот мой CallHandler:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension;
namespace calc.Tracing
{
public class NonNegativeCallHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input,
GetNextHandlerDelegate getNext)
{
// Perform the operation
var methodReturn = getNext().Invoke(input, getNext);
// Method failed, go ahead
if (methodReturn.Exception != null)
return methodReturn;
// If the result is negative, then throw an exception
var result = (Int32)methodReturn.ReturnValue;
if (result < 0)
{
var exception = new ArgumentException("...");
var response = input.CreateExceptionMethodReturn(exception);
// Return exception instead of original return value
return response;
}
return methodReturn;
}
public int Order { get; set; }
}
}
И наконец
*Вот мое определение атрибута:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity.InterceptionExtension;
using Microsoft.Practices.Unity;
namespace calc.Tracing
{
public class NonNegativeCallHandlerAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new NonNegativeCallHandler();
}
}
}
Что еще мне нужно добавить и где (файл конфигурации или внутри конструктора и т. д.), чтобы этот код работал.