• Unity 的ICallHander在C#项目中实现注入


    项目包引用: 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();
            }
    

      

  • 相关阅读:
    maven的.m2文件夹
    maven parent.relativePath
    GoLang structTag说明
    Mac下如何用SSH连接远程Linux服务器
    String.split
    Laya 类列表加载优化
    JavaEE JDBC 了解数据库连接池
    JavaEE JDBC 了解JNDI
    JavaEE JDBC 事务
    JavaEE JDBC RowSet行集
  • 原文地址:https://www.cnblogs.com/sgciviolence/p/3929916.html
Copyright © 2020-2023  润新知