当前位置: 首页 > 编程日记 > 正文

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

相关文章:

Python编写循环的两个建议 | 鹅厂实战

作者 | piglei&#xff08;腾讯高级工程师&#xff09;转载自腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说&#xff0c;机器相比人类的最大优点之一&#xff0c;就是机器可以不眠不休的重复做某件事情&#xff0c;但人却不行。而“循环”&#xff0c;则是实现让…

作为JavaScript开发人员,这些必备的VS Code插件你都用过吗

本文翻译自&#xff1a;https://www.sitepoint.com/vs-code-extensions-java-developers/转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。如今&#xff0c;Visual Studio Code无疑是最流行的轻量级…

matlab常遇小问题汇总

1、如何注释掉多行&#xff1a; 同时注释掉多行&#xff0c;有2种方法可行&#xff1a; (1)、选中所有要注释的行&#xff0c;按快捷键"Ctrl R" 或者 选择工具菜单"Text --> Comment"; 如果释放所有要注释的行&#xff0c;则按快捷键"Ctrl T&qu…

《几何与代数导引》习题1.35.4

求直线之间的距离$l_1:\frac{x1}{-1}\frac{y-1}{3}\frac{z5}{2}$.$l_2:\frac{x}{3}\frac{y-6}{-9}\frac{z5}{-6}$.解&#xff1a;点$q(-1,1,-5)$在直线$l_1$上&#xff0c;点$p(0,6,-5)$在直线$l_2$上.$\vec{pq}(-1,-5,0)$.直线$l_1$的方向向量为$(-1,3,2)$,直线$l_2$的方向向量…

深度学习难,这本书让你轻松学深度学习

深度学习在短短几年之内便让世界大吃一惊。它非常有力地推动了计算机视觉、自然语言处理、自动语音识别、强化学习和统计建模等多个领域的快速发展。随着这些领域的不断进步&#xff0c;人们现在可以制造自动驾驶的汽车&#xff0c;基于短信、邮件甚至电话的自动回复系统&#…

matlab中用于小数取整的函数的用法

matlab中小数取整的函数大约有四个&#xff1a;floor、ceil、round、fix 若 A [-2.0, -1.9, -1.55, -1.45, -1.1, 1.0, 1.1, 1.45, 1.55, 1.9, 2.0]; floor:朝负无穷方向靠近最近的整数&#xff1b; floor(A) ans -2 -2 -2 -2 -2 1 1 1 1 …

SQLServer之删除约束

使用SSMS数据库管理工具删除约束 1、连接数据库&#xff0c;选择数据表-》展开键或者约束-》选择要删除的约束-》右键点击-》选择删除。 2、在删除对象弹出框中-》点击确定。 3、刷新表-》展开键或者约束-》查看结果。 使用T-SQL脚本删除约束 语法&#xff1a; --声明数据库使用…

新建silverlight项目提示未将对象设置到实例解决方案

1.打开 visual studio 命令提示 输入一下命令 2.devenv /resetskippkgs 这条命令会启动visual stuio 关闭visual studio然后输入下面的命令3.devenv /setup

毕业十年后,我忍不住出了一份程序员的高考试卷

作者 | 程序员小吴转载自公众号五分钟学算法&#xff08;ID: CXYxiaowu&#xff09;一、选择题&#xff08;共计 50 分&#xff09;1、在下列四种排序算法&#xff0c;只有&#xff08; &#xff09;是一种不稳定排序A、冒泡排序B、选择排序C、插入排序D、归并排序2、一个数组&…

查看matlab中函数源代码的方法

有几种方法可以实现查看matlab里自带函数的源代码&#xff1a; 在命令窗口中输入&#xff1a; (1)、type 函数名(如 type rgb2gray 或者 type rgb2gray.m):即可在命令窗口中显示此函数的源代码&#xff1b; (2)、open 函数名(如 open rgb2gray 或者 open rgb2gray.m):即可打开…

Watir-webdriver处理table

最近大脸猫同学给了我一个popup的demo&#xff0c;让我试着定位弹出窗口中的按钮元素。在研究过程中&#xff0c;发现webdriver与watir代码有区别&#xff0c;一度让我很郁闷&#xff0c;在网上也找不到相应的解决方案&#xff0c;刚才code运行成功&#xff0c;在这记一笔&…

PyTorch Hub发布获Yann LeCun强推!一行代码调用经典模型

作者 | Team PyTorch译者 | Monanfei责编 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;导读&#xff1a;6月11日&#xff0c;Facebook PyTorch 团队推出了全新 API PyTorch Hub&#xff0c;提供模型的基本构建模块&#xff0c;用于提高机器学习研究的模型复…

【会议纪要】非洲新经济-线下沙龙分享

沙龙 主题&#xff1a; 《解开非洲新经济神秘面纱》 时间&#xff1a; 2018年09月08日 14&#xff1a;00 ~ 15&#xff1a;00 地点&#xff1a; 杭州丰潭路 UXCoffee 背景&#xff1a; 随着中非合作峰会召开&#xff0c;非洲发展潜力越来越受到关注。。。许多人眼中的非洲是贫穷…

图像处理和图像识别中常用的matlab函数

下面仅给出函数的大概意思&#xff0c;详细用法见&#xff1a; help 函数名 或 matlab help 1、imread&#xff1a;read image from graphics file&#xff1b; 2、imshow&#xff1a;display image in Handle Graphics figure&#xff1b; 3、imwrite&#xff1a;write image…

Powershell管理Active Directory 复制和拓扑

Powershell管理Active Directory 复制和拓扑 Active Directory 的 Windows PowerShell (AD) 支持复制和拓扑管理。它包含了管理复制、站点、域和林、域控制器和分区的功能。过去的管理工具&#xff08;如 AD 站点和服务管理单元与 repadmin.exe&#xff09;的用户将发现如今也可…

实战 | 如何用最快的速度学会Dlib人脸识别开发?

作者 | 小宋是呢来源 | 转载自小宋是呢项目GitHub地址&#xff1a;https://github.com/xiaosongshine/dlib_face_recognition1.背景介绍Dlib是一个深度学习开源工具&#xff0c;基于C开发&#xff0c;也支持Python开发接口&#xff0c;功能类似于TensorFlow与PyTorch。但是由于…

matlab内存管理

转自&#xff1a;http://my.donews.com/deng/2006/09/24/vijgqxehmkxiruywdauvxyiafogtskeymhyw/ 用 Matlab 进行大规模科学计算或仿真时&#xff0c;内存是一个需要时常注意的问题。当你写的 Matlab 程序跳出“Out of Memory” 时&#xff0c;以下几点措施是需要优先考虑的解决…

Koa2和Redux中间件源码研究

一、Koa2中间件源码分析 在Koa2中&#xff0c;中间件被存放在一个数组中。 使用koa中&#xff0c;最常见的就是app.use(fn)&#xff0c;use函数部分源码如下所示。首先中间件必须是个函数。若是generator函数&#xff0c;则需要进行转化。最后把该中间件推入middelaware数组中。…

matlab内存管理(二)

转自&#xff1a;http://hi.baidu.com/bi%CB%AB%C9%FA%BB%A8/blog/item/5ab86c38ac2f45e715cecbab.html 1&#xff0c;确保内存的连续性Matlab 中数组必须占用连续分配的内存段当无法为新建的数组分配连续的内存段的时候Out of Memory 就会出现由于反复分配和释放数组会使可用的…

校招经验分享—高考结束!校招还会远么~~

作者 | 石晓文来源 | 转载自小小挖掘机&#xff08;ID: wAIsjwj&#xff09;今天是6.11&#xff0c;高考已经结束了&#xff0c;那大考-校招还会远么&#xff1f;我们先来看一下去年的校招时间表&#xff1a;互联网大厂校招一般7月就开始了&#xff0c;也就是说&#xff01;如果…

数据科学究竟是什么?

数据科学是一门将数据变得有用的学科。它包含三个重要概念&#xff1a; 统计机器学习数据挖掘/分析数据科学的定义 如果你回顾一下数据科学这个术语的[早期历史]()&#xff0c;会发现有两个主题密切相连&#xff1a; 大数据意味着计算机的使用频率增加。统计学家很难将纸张上所…

SQL with NUll处理,Join系列,between,in对比exists以及少量题目

2019独角兽企业重金招聘Python工程师标准>>> 1.一些题目: 选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜) Selecta,b,c from tableta wherea(select max(a) from tabletb where tableb.b tableta.b ) 随机抽取出10条数据 Select to…

清华大学提出APDrawingGAN,人脸照片秒变艺术肖像画

作者 | 刘永进教授来源 | 转载自数据派THU&#xff08;ID:DatapiTHU&#xff09;清华大学提出APDrawingGAN&#xff0c;该项工作被CVPR 2019录取为oral paper。CVPR是计算机视觉和人工智能领域内的国际顶级会议&#xff0c;2019共收到投稿5160篇&#xff0c;录取1300篇&#xf…

图像处理和图像识别中常用的OpenCV函数

1. cvLoadImage&#xff1a;将图像文件加载至内存&#xff1b; 2. cvNamedWindow&#xff1a;在屏幕上创建一个窗口&#xff1b; 3. cvDestroyWindow&#xff1a;销毁显示图像文件的窗口&#xff1b; 4. cvDestroyAllWindows&#xff1a;销毁显示图像文件的所有窗口…

SQLServer之DEFAULT约束

原文:SQLServer之DEFAULT约束DEFAULT约束添加规则 1、若在表中定义了默认值约束&#xff0c;用户在插入新的数据行时&#xff0c;如果该行没有指定数据&#xff0c;那么系统将默认值赋给该列&#xff0c;如果我们不设置默认值&#xff0c;系统默认为NULL。 2、如果“默认值”字…

tmux/screen里面如何用鼠标滚轮来卷动窗口内容

tmux里面用鼠标滚轮来卷动窗口内容在 tmux里面&#xff0c;因为每个窗口(tmux window)的历史内容已经被tmux接管了&#xff0c;所以原来console/terminal提供的ShiftPgUp/PgDn所显示的内容并不是当前窗口的历史内容&#xff0c;所以要用C-b [ 进入copy-mode&#xff0c;然后才能…

图像空间变换--imtransform

转自&#xff1a;http://juyishaanxi.blog.163.com/blog/static/602733002010522105439617/(非原处)空间几何变换将(w,z)坐标系上的图像变换为(x,y)坐标系上的图像&#xff0c;可以表示为&#xff1a; (x,y) T{(w,z) 比如&#xff1a; (x,y) T{(w,z)} (w/2, z/2) 仿射变…

谷歌用1.2万个模型“推翻”现有无监督研究成果!斩获ICML 2019最佳论文

作者 | 夕颜、Just出品 | AI科技大本营(ID:rgznai100)6 月 11 日&#xff0c;在美国加州长滩举行的 ICML 公布了 2019 年最佳论文奖&#xff0c;来自苏黎世联邦理工大学、谷歌大脑等的团队和英国剑桥大学团队摘得最佳论文奖项&#xff0c;此外&#xff0c;大会还公布了 7 篇获最…

实战:掌握PyTorch图片分类的简明教程 | 附完整代码

作者 | 小宋是呢转载自CSDN博客1.引文深度学习的比赛中&#xff0c;图片分类是很常见的比赛&#xff0c;同时也是很难取得特别高名次的比赛&#xff0c;因为图片分类已经被大家研究的很透彻&#xff0c;一些开源的网络很容易取得高分。如果大家还掌握不了使用开源的网络进行训练…

python group()

正则表达式中&#xff0c;group&#xff08;&#xff09;用来提出分组截获的字符串&#xff0c;&#xff08;&#xff09;用来分组 import re a "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体 print re.sea…