Unity的三种Interceptor

news/2024/7/8 1:04:17

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();

http://lihuaxi.xjx100.cn/news/268466.html

相关文章

搭建samba服务器

先安装samba服务器&#xff0c; 常规安装 sudo apt-get install samba 这种方式在不同版本ubuntu中&#xff0c;由于库版本支持问题&#xff0c;可能是无法安装的&#xff0c;所以需要降库版本来安装&#xff0c;安装命令为&#xff1a;sudo aptitude install samba ,这样执行后…

C# 多态的实现

C# 多态的实现 封装、继承、多态&#xff0c;面向对象的三大特性&#xff0c;前两项理解相对容易&#xff0c;但要理解多态&#xff0c;特别是深入的了解&#xff0c;对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践&#xff0c;封装、继承在实际…

蜡笔小新鸿蒙系统,盘点蜡笔小新最污的四处剧情,网友:当年太纯洁现在终于看懂!...

《蜡笔小新》是童年时的一部经典动漫作品&#xff0c;里面的主角小新给我们带来了许多的乐趣。不过在《蜡笔小新》的剧情中却有很多比较污的剧情让当年的我们没有看懂&#xff0c;而现在再来回顾一下发现当年的这些剧情怎么可以这么污&#xff01;&#xff01;第一处&#xff1…

字符集图标制作

字符集图标&#xff1a; 将网页上常见的icon做成font&#xff08;字符集&#xff09;&#xff0c;以字体的方式插入到网页上&#xff0c;作用是减轻服务器负担&#xff0c;减少宽带。 我最常在这两个网站上下载字体图标&#xff1a; https://icomoon.io/app/#/select https://w…

为什么说机器学习是预防欺诈的最佳工具?

作者 | Giorgi Mikhelidze译者 | 天道酬勤&#xff0c;责编 | 晋兆雨头图 | CSDN付费下载自视觉中国随着现代技术的发展和完善&#xff0c;生活变得越来越舒适。虽然以前人们认为同时进行复杂的操作是不可能的&#xff0c;而如今计算机使这一任务变得很容易了。 与此同时&#…

神经网络 debug 太难了,这里有六个实用技巧

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 神经网络的 debug 过程着实不容易&#xff0c;这里是一些有所帮助的 tips。基于神经网络的项目瓶颈通常并非对网络的实现。有时候&#xff0c;在编写了所有代码并尝试了一…

正则表达式re模块使用介绍

1. re模块的介绍 在Python中需要通过正则表达式对字符串进行匹配的时候&#xff0c;可以使用一个 re 模块 # 导入re模块 import re# 使用match方法进行匹配操作 result re.match(正则表达式,要匹配的字符串)# 如果上一步匹配到数据的话&#xff0c;可以使用group方法来提取数…

深入理解空洞卷积

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达导读 空洞卷积在图像分割需要增加感受野同时保持特征图的尺寸的需求中诞生&#xff0c;本文详细介绍了空洞卷积的诞生、原理、计算过程以及存在的两个潜在的问题&#xff…