项目包引用: Install-Package Unity.Interception
创建项目的接口和其实类:
public interface ICalculator { double CalculateAdd(double a, double b); double CalculateMultiply(double a, double b); double CalculateMinus(double a, double b); double CalculateDevide(double a, double b); } [LoggerIndicate] public class Calculator:ICalculator { public double CalculateAdd(double a, double b) { return a + b; } public double CalculateMultiply(double a, double b) { return a * b; } public double CalculateMinus(double a, double b) { return a - b; } public double CalculateDevide(double a, double b) { return a / b; } }
创建一个方法注入的类,这个类必须实现ICallHander接口
public class LoggerHandler : ICallHandler { public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { var traceId = System.Guid.NewGuid().ToString(); TimeRecorder tr = new TimeRecorder(); var result = getNext()(input, getNext); tr.Dispose(); StringBuilder sb = new StringBuilder(); sb.AppendFormat("Call {0} (", input.MethodBase.Name); foreach (var parameter in input.Arguments) { sb.Append(parameter.ToString()).Append(","); } sb.Append(")"); sb.AppendFormat(" takes {0}ms", tr.ElapsedMilliseconds); Console.WriteLine(sb.ToString()); return result; } public int Order { get; set; } //用来控制执行顺序 }
创建属性来标是否需要注入
public class LoggerIndicateAttribute : HandlerAttribute
{
public override ICallHandler CreateHandler(IUnityContainer container) {
return new LoggerHandler();
}
}
最后测试
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
container.AddNewExtension<Interception>();
container.RegisterType<ICalculator, Calculator>()
.Configure<Interception>()
.SetInterceptorFor<ICalculator>(new InterfaceInterceptor());
// Resolve
ICalculator calc = container.Resolve<ICalculator>();
var d = calc.CalculateAdd(1, 2);
d = calc.CalculateMinus(23, 3);
Console.Read();
}