使用Unity解耦你的系统—PART4——Unity&PIAB
在前面几篇有关Unity学习的文章中,我对Unity的一些常用功能进行介绍,包括:Unity的基本知识、管理对象之间的关系、生命周期、依赖注入等,今天则是要介绍Unity的另外一个重要功能——拦截(Interception)。
以下是本文所要介绍的内容:
1、Unity与PIAB的关系。
2、使用Unity来接管PIAB的功能实现。
一、Unity与PIAB的关系
Unity中的Interception可以通过Unity的Container或独立的API(Intercept)来实现,这些具体的实现没有包含在 Unity本身的类库中,而独立放在Unity.Interception这个类库中,想深入了解的朋友可以查看下这个类的具体源代码。今天介绍的则是 Unity与企业库内置的PolicyInjection模块的使用。
在我看来,PolicyInjection就像是Unity.Interception模块的一个通用封装,在PIAB中包含了各种常用的 MatchRules(匹配规则)与CallHandler(调用处理程序),其中各种CallHandler都是实现 Unity.InterceptionExtension.ICallHandler,而ICallHandler其定义与 Unity.InterceptionExtension.IInterceptionBehavior类似的。所以由于PIAB中已经内置好了各种常用 的功能,我们只需按照我们的需求调用既可(可参看:内置Call Handler介绍和自定义Matching Rule),如果需要有特殊的逻辑也只需自己定义具体的CallHandler既可(可参看:建立自定义Call Handler实现用户操作日志记录),当然这些都是建立在PIAB的基础上的,如果你不想通过PIAB来实现AOP拦截处理的话,你就可以直接实现Unity中的IInterceptionBehavior来进行具体的业务处理,这个在后面的文章中会介绍到。
其实查看过PIAB模块源码的朋友就可以发现,其实PIAB本质上都是依赖于Unity.Interception模块,其本身没有具体的实现,其具体实 现都包含在Unity.Interception.PolicyInjection下(包括MatchRules与CallHandler),有兴趣的朋 友可以查看下。由于PIAB依赖于Unity.Interception,所以我们完全可以通过Unity来接管原有PIAB的所有功能(包括各种配置信 息)。
二、使用Unity来接管PIAB的功能实现
在建立自定义Call Handler实现用户操作日志记录一文中我已经实现好了一个自定义的CallHandler(如不了解可以先查看下PIAB相关的文章),不过表示层的具体调用还是通过PIAB的PolicyInjection.Create来获取具体对象,而现在我就要通过Unity来接管原来PIAB的这些对象创建,这样极大程度的统一了对象创建与依赖管理。
我这边还是通过代码及配置2种方式来实现Unity接管PIAB的功能,首先是代码的形式,代码配置相对来说比较繁琐,见如下代码:
private void Login1()
{
try
{
IUnityContainer container = new UnityContainer().AddNewExtension<Interception>();
container.Configure<Interception>()
//为IStudentManage设置拦截器为TransparentProxyInterceptor
.SetDefaultInterceptorFor<IStudentManage>(new TransparentProxyInterceptor())
.AddPolicy("UserLog")
//增加MemberNameMatchingRule,使用InjectionConstructor初始化MemberNameMatchingRule的构造函数
.AddMatchingRule<MemberNameMatchingRule>
(new InjectionConstructor("Login"))
//增加CallHandler,使用InjectionConstructor来初始化CallHandler的构造函数
.AddCallHandler<UserLogCallHandler>
("UserLogCallHandler",
new ContainerControlledLifetimeManager(),
new InjectionConstructor("登录成功", ""));
//注册对象关系
container.RegisterType<IStudentManage, StudentManage>();
IStudentManage studentBll = container.Resolve<IStudentManage>();
bool isAdmin2 = false;
if (studentBll.Login(txtUid.Text.Trim(), txtPwd.Text.Trim(), out isAdmin2))
{
if (string.IsNullOrEmpty(Request.QueryString["returnUrl"]) == false)
{
Response.Redirect(Request.QueryString["returnUrl"]);
}
else
{
Response.Redirect("~/Default.aspx");
}
}
else
{
ltMsg.Text = "用户名或密码不正确,请重试!";
}
}
catch (Exception ex)
{ throw;
}
}
在底层不变的情况下,表示层如果想通过Unity来实现需要以上的代码配置。虽然配置较为繁琐,但是Unity很好的接管了PIAB的功能同时很大程度的解决了代码之间的耦合关系,其中有3个注意点:
1、创建Unity的container容器时需要增加Interception扩展:.AddNewExtension<Interception>();
2、在增加策略是需要为需要拦截的接口增加拦截器:SetDefaultInterceptorFor<IStudentManage>(new TransparentProxyInterceptor())
3、如果MatchRule或CallHandler有相应的构造函数需要通过InjectionConstructor类来初始化构造函数。
接下来是配置文件的代码,如下代码:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<!--新增配置节扩展,用于下面的<interception>配置节-->
<sectionExtension
type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,
Microsoft.Practices.Unity.Interception.Configuration" />
<alias alias="IStudentManage" type="EntLibStudy.IBLL.IStudentManage,EntLibStudy.IBLL"/>
<alias alias="StudentManage" type="EntLibStudy.BLL.StudentManage,EntLibStudy.BLL"/>
<container>
<!--为容器增加Interception扩展,如不增加下面interception配置会报错-->
<extension type="Interception"/>
<interception>
<!--增加一个名为UserLog的拦截策略,用于记录日志-->
<policy name="UserLog">
<!--新增MemberNameMatchingRule匹配规则,同时需要同过配置初始化匹配规则构造函数
具体可查看Unity.InterceptionExtension.PolicyInjection.MatchRule下具体类-->
<matchingRule name="Member Name Matching Rule" type="MemberNameMatchingRule">
<constructor>
<param name="nameToMatch" value="Login"/>
</constructor>
</matchingRule>
<!--增加调用处理程序,这边指定的是我自定义的UserLogCallHandler-->
<!--同样也需要初始化构造函数-->
<callHandler name="UserLogCallHandler"
type="EntLibStudy.Helper.EntLibExtension.PolicyInjectionExtension.UserLogCallHandler,
EntLibStudy.Helper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<constructor>
<param name="message" type="System.String" value="登录成功!">
</param>
<param name="parameterName" type="System.String" value=" ">
</param>
</constructor>
</callHandler>
</policy>
</interception>
<!--注册对象关系,需要注意的是需要为这个注册增加TransparentProxyInterceptor的拦截器-->
<register type="IStudentManage" mapTo="StudentManage">
<interceptor isDefaultForType="true" type="TransparentProxyInterceptor"/>
</register>
</container>
</unity>
读取配置程序代码如下:
private void Login2()
{
IUnityContainer container = new UnityContainer()
.LoadConfiguration("Log");
IStudentManage studentBll = container.Resolve<IStudentManage>();
bool isAdmin2 = false;
if (studentBll.Login(txtUid.Text.Trim(), txtPwd.Text.Trim(), out isAdmin2))
{
if (string.IsNullOrEmpty(Request.QueryString["returnUrl"]) == false)
{
Response.Redirect(Request.QueryString["returnUrl"]);
}
else
{
Response.Redirect("~/Default.aspx");
}
}
else
{
ltMsg.Text = "用户名或密码不正确,请重试!";
}
}
可以看到配置文件代码相对来说也不少,但是对于项目使用来说还是偏向于通过配置来解决代码的耦合问题,而且Unity的XSD提供了很好的智能提 示,保证了书写配置文件效率及正确性,而且通过将这种具体的关联移到配置文件中也可以大大的减少程序代码的书写,程序代码只需要一句简单初始化+读取配置 节既可完成。
配置方式实现的注意点和代码实现类似,我已经写在上面的配置文件中了,其效果和代码配置是一样的。
以上就是本文的所有内容了,仅仅介绍了如何通过Unity来接管PIAB的工作,我这边举的例子是依赖于我原先自己创建的CallHandler,内置的CallHandler配置也是类似的,这边就不再详细介绍了,想了解的朋友还是去查看Unity的官方文档。
有关Unity的拦截技术点可以查看官方文档:Unity Interception Techniques
源代码下载:点我下载
使用Unity解耦你的系统—PART4——Unity&PIAB的更多相关文章
- 使用Unity解耦你的系统—PART3——依赖注入
继续学习Unity,在前几篇中已经将Unity的使用方法做了一个还算详细的介绍了,主要是如何通过代码及配置文件来注册对象之间的关系.Unity内置所有的生命周期管理使用介绍,及Unity的Regist ...
- 微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(3)
今天继续介绍Unity,在上一篇的文章中,我介绍了使用UnityContainer来注册对象之间的关系.注册已存在的对象之间的关系,同时着重介绍 了Unity内置的各种生命周期管理器的使用方法,今天则 ...
- 使用微软企业库5.0提供的unity配置解藕系统demo(源码)
最近公司集50多号开发人员的人力围绕一个系统做开发,框架是免不了要统一的,公司提供的架构,利于分工合作,便于维护,扩展,升级,其中使用了到微软的企业库来解藕系统,只是因为框架封装,于是在网上学习了一个 ...
- (四)Hololens Unity 开发之 凝视系统
学习源于官方文档 Gaze in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 HoloLens 有三大输入系统,凝视点.手势和声音 ~ 本文主要记录凝视 ...
- Unity笔记 英保通 Unity新的动画系统Mecanim
Mecanim动画系统是Unity独一无二.强大灵活的人物动画系统.该系统赋予您的人类和非人类人物令人难以置信的自然流畅的动作,使它们栩栩如生.游戏中角色设计提高到了新的层次,在处理人类动画角色中可以 ...
- 升级MAC OS到10.13, 10.14系统后UNITY工程无法加载资源的解决办法
升级MAC OS到10.13, 10.14系统后,出现UNITY工程无法加载资源的情况: Unity项目中Asset目录显示为空! 解决办法一: 打开Launchpad中的磁盘工具 (也就是实用工具下 ...
- Unity 5着色器系统代码介绍(上)
http://forum.china.unity3d.com/thread-25724-1-10.html Unity 5着色器系统代码介绍(上) Unity在着色器开发方面提供了很大的灵活性.有些工 ...
- Unity3D_05_理解Unity的新GUI系统(UGUI)
理解Unity的新GUI系统(UGUI) Unity GUI 链接:UnityEngine.UI系统基础类架构图 Unity GUI 链接:UnityEngine Event & Event ...
- unity 对Animator动画系统的研究
unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看 ...
随机推荐
- springMVC和mybatis的原理
mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,my ...
- 多例模式,保证实例的唯一性,仅适用于form窗体
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- FTP、SFTP文件下载内容校验
描述: 从FTP.SFTP下载的文件做MD5码校验,文件名和MD5码值存放在表格里,表格位置在FTP.SFTP服务器上. os模块只能遍历本地目录/文件,需要先连接FTP.SFTP服务器,将表格下载到 ...
- ⑦ 设计模式的艺术-13.代理(Proxy)模式
为什么需要代理模式 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口. 开闭原则,增加 ...
- Netty 入门初体验
Netty简介 Netty是一款异步的事件驱动的网络应用程序框架,支持快速开发可维护的高性能的面向协议的服务器和客户端.Netty主要是对java 的 nio包进行的封装 为什么要使用 Netty 上 ...
- http://www.cnblogs.com/kkdn/
/*** PHP保留两位小数的几种方法* @link http://www.phpddt.com*/$num = 10.4567; //第一种:利用round()对浮点数进行四舍五入echo roun ...
- hdu 3729 I'm Telling the Truth(二分匹配_ 匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS ( ...
- 简单响应式Bootstrap框架中文官网页面模板
链接:http://pan.baidu.com/s/1o7MQ6RC 密码:kee5
- uboot1.1.6 start.s分析
.Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下:(1)定义入口.由于一个可执行的Image必须有一个入口点,并 ...
- 背包DP FOJ 2214
题目:http://acm.fzu.edu.cn/problem.php?pid=2214 (http://www.fjutacm.com/Problem.jsp?pid=2053) 这题看起来是一题 ...