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();
复制代码

 

作者:RunStone

出处:https://www.cnblogs.com/RunStone/p/14361021.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   奔跑石头  阅读(240)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示