Loading

castle 动态代理(同步)

   Castle DynamicProxy是用于在运行时生成代理对象的类库。下图是castle.core官方描叙拦截器的执行图。                       

             

 

实现步骤

    1.要拦截的接口,类型定义

     2.拦截器的定义,实现IInterceptor接口

     3.创建动态代理,调用

简单示例

public interface ISimpleInterface
    {
        int Do();
    }


    public class SimpleClass : ISimpleInterface
    {
        public int Do()
        {
            Console.WriteLine("this is five");
            return 5;
        }
    }

2.

public class LogInvocationInterceptor : IInterceptor
    {
        private StringBuilder sb = new StringBuilder();
        private List<string> invocations = new List<string>();

        public bool Proceed = true;
        public void Intercept(IInvocation invocation)
        {
            PreProceed(invocation);
            PerformProceed(invocation);
            PostProceed(invocation);
        }

        protected virtual void PerformProceed(IInvocation invocation)
        {
            if (Proceed)
            {
                invocation.Proceed();
            }
            else if (invocation.Method.ReturnType.IsValueType && invocation.Method.ReturnType != typeof(void))
            {
                invocation.ReturnValue = Activator.CreateInstance(invocation.Method.ReturnType); // set default return value
            }
        }

        protected virtual void PreProceed(IInvocation invocation)
        {
            invocations.Add(invocation.Method.Name);

            sb.Append(string.Format("{0} ", invocation.Method.Name));
        }

        protected virtual void PostProceed(IInvocation invocation)
        {
        }

        public string LogContents
        {
            get { return sb.ToString(); }
        }

        public IList Invocations
        {
            get { return invocations; }
        }
    }

3.

   var result = new ProxyGenerator().CreateInterfaceProxyWithTarget<ISimpleInterface>(new SimpleClass(), new LogInvocationInterceptor());
            var returnValue = result.Do();

动态代理与autofac 的结合使用

       nuget 安装 autofac 与Autofac.Extras.DynamicProxy

 

  var builder = new ContainerBuilder();
            builder.RegisterType<SimpleClass>()
       .As<ISimpleInterface>()
    .EnableInterfaceInterceptors().InterceptedBy(typeof(LogInvocationInterceptor));

            builder.RegisterType<LogInvocationInterceptor>().SingleInstance();
            var container = builder.Build();
            var foo = container.Resolve<ISimpleInterface>();
            foo.Do();

 

posted @ 2021-02-02 11:24  奔跑石头  阅读(262)  评论(0)    收藏  举报