首先,我之前从来没有用过Unity...我想通过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;
}
}
}
这是我的呼叫处理程序:
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();
}
}
}
我还需要添加什么以及在哪里(配置文件或内部构造函数等)才能使此代码正常工作。