使用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,读者可以边看 ...
随机推荐
- 14.Android UiAutomator 图像处理
一.BitMap介绍 1.图像使用场景 1)效果类截图 2)不可见的组件图像对比 3)失败与异常截图 4)利用图像判断组件 2.部分API简单说明 API 说明 compress 压缩图片 copy ...
- duilib 修复padding属性导致其他控件自动计算宽高度错误的bug和导致自己宽高度错误的bug
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42950733 BUG 一:padding导致其他控件宽 ...
- 2017北京国庆刷题Day2 afternoon
期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一 ...
- Bayesian optimisation for smart hyperparameter search
Bayesian optimisation for smart hyperparameter search Fitting a single classifier does not take long ...
- 【leetcode 简单】第十四题 最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...
- HDU 1059 Dividing (dp)
题目链接 Problem Description Marsha and Bill own a collection of marbles. They want to split the collect ...
- 转:字符集和字符编码(Charset & Encoding)
转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创 ...
- ubuntu12.04 svn ssl错误
1,ubuntu12.04 svn ssl错误提示: OPTIONS of '<url>': SSL handshake failed: SSL error: Key usage viol ...
- iTextSharp操作pdf之pdfCreater
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- java各种链路工具性能监控工具
Zipkin , Instana 和 Jaeger cat链路追踪系统 用于监控spring 的运行情况,比如内存,线程,池等宏观数据 spring boot admin java反编译 jar xv ...