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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构