標籤:style blog color os io for ar div log
項目包引用: 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(); }
Unity 的ICallHander在C#項目中實現注入