Unity的三种Interceptor
Unity默认提供了三种拦截器:TransparentProxyInterceptor、InterfaceInterceptor、VirtualMethodInterceptor。
TransparentProxyInterceptor:代理实现基于.NET Remoting技术,它可拦截对象的所有函数。缺点是被拦截类型必须派生于MarshalByRefObject。示例如下:
1 public class MyObject : MarshalByRefObject 2 { 3 public String Name { get; set; } 4 } 5 6 IUnityContainer unityContainer = new UnityContainer(); 7 8 unityContainer.AddNewExtension<Interception>(); 9 unityContainer.RegisterType<MyObject>(new Interceptor<TransparentProxyInterceptor>(), new InterceptionBehavior(new NotifyPropertyChangedBehavior())); 10 11 MyObject myObject = unityContainer.Resolve<MyObject>(); 12 13 ((INotifyPropertyChanged)myObject).PropertyChanged += new PropertyChangedEventHandler((sender, e) => Console.WriteLine(e.PropertyName)); 14 15 myObject.Name = “hello, world”;
InterfaceInterceptor:只能对一个接口做拦截,好处时只要目标类型实现了指定接口就可以拦截。示例如下:
1 public class MyObject2 : IServiceProvider 2 { 3 4 #region IServiceProvider Members 5 6 public object GetService(Type serviceType) 7 { 8 return null; 9 } 10 11 #endregion 12 } 13 14 public sealed class MyInterceptionBehavior : IInterceptionBehavior 15 { 16 #region IInterceptionBehavior Members 17 18 public Boolean WillExecute 19 { 20 get { return true; } 21 } 22 23 public IEnumerable<Type> GetRequiredInterfaces() 24 { 25 return new Type[0]; 26 } 27 28 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 29 { 30 return getNext()(input, getNext); 31 } 32 33 #endregion 34 } 35 36 IUnityContainer unityContainer = new UnityContainer(); 37 38 unityContainer.AddNewExtension<Interception>(); 39 unityContainer.RegisterType<IServiceProvider, MyObject2>(“MyObject2″, 40 new Interceptor<InterfaceInterceptor>(), 41 new InterceptionBehavior<MyInterceptionBehavior>() 42 ); 43 44 IServiceProvider myObject = unityContainer.Resolve<IServiceProvider>(“MyObject2″); 45 46 myObject.GetService(typeof(MyObject2));
注册类型时需要显示指定被拦截接口类型。
VirtualMethodInterceptor:对virtual函数进行拦截。缺点是如果被拦截类型没有virtual函数则无法拦截,这个时候如果类型实现了某个特定接口可以改用InterfaceInterceptor。看一个简单示例:
1 public class MyObject3 2 { 3 public virtual void DoWork() 4 { 5 6 } 7 } 8 9 IUnityContainer unityContainer = new UnityContainer(); 10 11 unityContainer.AddNewExtension<Interception>(); 12 unityContainer.RegisterType<MyObject3>( 13 new Interceptor<VirtualMethodInterceptor>(), 14 new InterceptionBehavior<MyInterceptionBehavior>() 15 ); 16 17 MyObject3 myObject = unityContainer.Resolve<MyObject3>(); 18 19 myObject.DoWork();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?