zoukankan      html  css  js  c++  java
  • 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();
            }
    

      

  • 相关阅读:
    Andorid自定义attr的各种坑
    git 使用那些事儿
    Gradle task
    他们要消失了吗?探访人工智能浪潮下的鉴黄师
    测试环境docker化—容器集群编排实践
    测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作
    后台服务项目的白盒测试之旅
    利用反向代理测应用的流量
    CCF 201312-5 I’m stuck! (暴力,BFS)
    CodeForces 709C Letters Cyclic Shift (水题)
  • 原文地址:https://www.cnblogs.com/sgciviolence/p/3929916.html
Copyright © 2011-2022 走看看