(转)[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)...
原文地址:http://www.cnblogs.com/kyo-yo/archive/2010/11/01/Learning-EntLib-Tenth-Decoupling-Your-System-Using-The-Unity-PART2-Learn-To-Use-Unity-One.html
在上一篇文章中,我简单介绍Unity的一些背景知识、为什么要使用Unity和使用Unity有什么好处。今天将继续学习Unity,主要是了解Unity的一些常见的使用方法。
本篇文章将主要介绍:
Unity中的UnityContainer基本使用介绍,包括UnityContainer类的常用方法介绍,并且通过几个小例子来介绍具体的使用方法,这些例子都会以代码及配置文件两种方式来实现。
从UnityContainer(Unity容器)这个类的名称中我们就可以看出其是Unity最重要的类,UnityContainer就像Unity 的一个司令部,而一个个对象就像一名名士兵,每个士兵来去都需要通过UnityContainer来管理,其掌管了所有对象的依赖关系,所有对象的创建都 会通过这个Unity容器来创建,,同时也可以说是一个外交部,对于我们开发者,我们不需要关心内部是怎么实现的,我们只需要事先设置好对象之间的关系, 然后在需要的时候告诉UnityContainer我需要什么,UnityContainer就会将我们需要的直接发给我们。(这些比喻可能不正确,但是 是我能想到的最好的比喻了)
使用代码实现对象关联注册:
首先来看一个简单的例子:
01
|
public interface IClass
|
02
|
{
|
03
|
void ShowInfo();
|
04
|
}
|
05
|
public class MyClass : IClass
|
06
|
{
|
07
|
public MyClass()
|
08
|
{
|
09
|
10
|
}
|
11
|
12
|
public void ShowInfo()
|
13
|
{
|
14
|
Console.WriteLine( "这个是我的班级" );
|
15
|
}
|
16
|
}
|
17
|
具体调用:
|
1
|
static void Main( string [] args)
|
2
|
{
|
3
|
IClass classInfo = new MyClass();
|
4
|
classInfo.ShowInfo();
|
5
|
}
|
这个是最常见的接口及其实现类的使用方法,定义一个接口,然后再定义一个类来实现这个接口,然后在具体使用的过程中,可以通过new关键字来实例化 具体来实现接口,虽然没有语法上的问题,但是这样会造成紧耦合,如果一旦具体的实现类发生了改变,则就需要修改代码,而且如果这种类似的代码很多,则会导 致整个项目的变动,甚至出现异常,所以我们需要使用IOC来解耦,具体代码如下:
01
|
public static void ContainerCode()
|
02
|
{
|
03
|
IUnityContainer container = new UnityContainer();
|
04
|
container.RegisterType<IClass, MyClass>();
|
05
|
//另一种注册方法,不过没有RegisterType<>()方法来的方便
|
06
|
//container.RegisterType(typeof(IClass), typeof(MyClass));
|
07
|
IClass classInfo = container.Resolve<IClass>();
|
08
|
//另一种通过container获取具体对象的方法
|
09
|
//IClass classInfo = container.Resolve(typeof(IClass));
|
10
|
classInfo.ShowInfo();
|
11
|
}
|
使用Unity来管理对象与对象之间的关系可以分为以下几步:
1、创建一个UnityContainer对象。
2、通过UnityContainer对象的RegisterType方法来注册对象与对象之间的关系。
3、通过UnityContainer对象的Resolve方法来获取指定对象关联的对象。
使用配置文件来实现对象关系注册:
以上是通过代码的方式来注册对象之间的关系,但是对于一个项目来说,正式部署后,由于代码都编译成DLL,如果要修改依赖关系则修改代码并重新编译,相对来说太麻烦了,所以Unity还提供配置文件配置的方式来配置对象之间的关系,配置如下:
01
|
<? xml version = "1.0" encoding = "utf-8" ?>
|
02
|
< configuration >
|
03
|
< configSections >
|
04
|
< section name = "unity"
|
05
|
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
|
06
|
Microsoft.Practices.Unity.Configuration"/>
|
07
|
</ configSections >
|
08
|
< unity xmlns = "http://schemas.microsoft.com/practices/2010/unity" >
|
09
|
< alias alias = "IClass" type = "UnityStudyConsole.IDemo.IClass, UnityStudyConsole" />
|
10
|
< alias alias = "MyClass" type = "UnityStudyConsole.Demo.MyClass, UnityStudyConsole" />
|
11
|
|
12
|
< container >
|
13
|
< register type = "IClass" name = "ConfigClass" mapTo = "MyClass" />
|
14
|
</ container >
|
15
|
</ unity >
|
16
|
</ configuration >
|
具体代码调用如下:
01
|
public static void ContainerConfiguration()
|
02
|
{
|
03
|
IUnityContainer container = new UnityContainer();
|
04
|
//获取指定名称的配置节
|
05
|
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection( "unity" );
|
06
|
//默认方法,默认获取名称为"unity"配置节下配置信息
|
07
|
container.LoadConfiguration();
|
08
|
//获取已命名的配置节<container name="FirstClass">下的配置信息
|
09
|
container.LoadConfiguration( "FirstClass" );
|
10
|
//获取特定配置节下配置信息
|
11
|
container.LoadConfiguration(section);
|
12
|
//获取特定配置节下已命名的配置节<container name="FirstClass">下的配置信息
|
13
|
container.LoadConfiguration(section, "FirstClass" );
|
14
|
15
|
IClass classInfo = container.Resolve<IClass>( "ConfigClass" );
|
16
|
classInfo.ShowInfo();
|
17
|
}
|
通过配置文件配置Unity信息需要有以下几个步骤:
1、在配置文件中<configSections> 配置节下unity注册。
2、在<configuration> 配置节下添加Unity配置信息。
3、在代码中读取配置信息,并将配置载入到UnityContainer中。
使用配置文件来配置对象信息虽然可以在部署的时候更改对象之间的依赖关系,但是当系统过于复杂,则就会导致配置文件的增大,所以我们需要将 Unity的配置信息从App.config或web.config中分离出来,但是这样的话前面的代码中调用方法就无效了,我们现在需要修改一下现有的 代码:
01
|
public static void ContainerConfigurationFromFile( string configFile)
|
02
|
{
|
03
|
//根据文件名获取指定config文件
|
04
|
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
|
05
|
//从config文件中读取配置信息
|
06
|
Configuration configuration =
|
07
|
ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
|
08
|
var unitySection = (UnityConfigurationSection)configuration.GetSection( "unity" );
|
09
|
10
|
var container = new UnityContainer()
|
11
|
.LoadConfiguration(unitySection, "FirstClass" );
|
12
|
13
|
IClass classInfo = container.Resolve<IClass>( "ConfigClass" );
|
14
|
classInfo.ShowInfo();
|
15
|
}
|
由于Unity配置相对来说比较复杂,一下子难以上手,而且不像企业库的其他模块可以通过配置工具进行配置,所以p&p小组为了方便通过配 置文件进行Unity配置,已经在企业库5.0的安装包中内置了UnityConfiguration20.xsd,你可以在X:\Program Files\Microsoft Visual Studio X.0\Xml\Schemas\下找到,这样就可以在配置文件中进行Unity配置时出现只能提示了,如下图:
需要注意的是,如果想出现这种提示,需要在新增的unity配置节中增加一个xmlns为http://schemas.microsoft.com/practices/2010/unity。(如果没有安装过EntLib5,所以没有UnityConfiguration20.xsd,可以在下面的示例代码中找到这个xsd。)
以上就是本文的所有内容了,主要是简单介绍一下UnityContainer的基本使用方法——如何通过代码及配置文件来实现对象之间关系,如有不对欢迎指出!
示例代码下载:点我下载
微软企业库5.0 学习之路系列文章索引:
第一步、基本入门
第二步、使用VS2010+Data Access模块建立多数据库项目
第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中)
第四步、使用缓存提高网站的性能(EntLib Caching)
第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇
第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——中篇
第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇
第六步、使用Validation模块进行服务器端数据验证
第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇
第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇
第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息
第九步、使用PolicyInjection模块进行AOP—PART1——基本使用介绍
第九步、使用PolicyInjection模块进行AOP—PART2——自定义Matching Rule
第九步、使用PolicyInjection模块进行AOP—PART3——内置Call Handler介绍
第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录
第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?
第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)
扩展学习:
扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]
转载于:https://www.cnblogs.com/fcsh820/archive/2010/11/09/1872775.html
(转)[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)...相关推荐
- [EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART5——使用Unity自身的拦截器...
在前一篇文章中,介绍了如何使用Unity来接管PIAB进行拦截操作,而Unity自身也提供了类似于ICallHandler的拦截处理程序--IInterceptionBehavior,今天这篇文章就是 ...
- [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...
本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...
- [EntLib]微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇...
在完成了后,今天开始介绍企业库中的新模块:Cryptographer(加密模块),这个模块在日常的大多数项目的作用非常重要,例如:网站会员密码.身份证号.网站配置等,通过对信息进行加密可以保证项目数据 ...
- 微软企业库5.0 学习之路——UnityPIAB 通过配置实现AOP
完全通过配置实现AOP的资料太少了,今天忙了好几个小时终于走通了,分享一下. 模拟业务是:登陆,记录登陆日志. // 业务接口 public interface IStudentManage{bool ...
- 微软企业库5.0学习笔记(三十三)数据访问模块
前言 鉴于企业库5.0已经发布正式版,同时有广大读者的要求(臭屁一下,o(∩_∩)o...),后面文章的内容和代码将基于Enterprise Library5.0和Unity2.0来写,感谢大家的一贯 ...
- 微软企业库4.1学习笔记(三十六)日志模块 简介
日志模块 企业库的日志模块简单的实现了日志功能的常用功能.开发者可以利用模块在下面的位置记录信息: 事件日志 电子邮件 数据库 消息队列 文本文件 WMI的事件查看器 自定义的位置 模块为记录在任何位 ...
- 微软企业库5.0学习笔记(四)配置企业库
http://blog.csdn.net/sfbirp/archive/2010/05/18/5603567.aspx 转载于:https://www.cnblogs.com/Rising/archi ...
- 微软企业库4.1学习笔记(三)企业库迁移和并行使用,以及企业库的扩展
一.迁移和并行使用 通常来说,企业库是建立在.NET 2.0 的基础上,使用后续版本的企业库也不需要改变任何代码.不需要将引用更新到新的程序集,也不需要在配置文件中指明程序集的正确版本. 这个版本4. ...
- 微软企业库4.1学习笔记(六)创建对象
一.创建应用模块对象 在你的应用中经常会需要创建例如Database或者是CacheManager之类的对象,企业库支持一系列的方法,可以创建应用需要的对象. 你可以使用工厂方法创建这些对象,企业库的 ...
最新文章
- 协议森林08 不放弃 (TCP协议与流通信)
- 利用QCustomePlot绘制热力图,瀑布图,频谱色图等
- 塞班自带浏览器下载路径问题
- 2021牛客暑期多校训练营1
- istio_关于Istio的五件事
- python字符串_四、Python的字符串
- 深度优先搜索(DFS)递归形式改为非递归形式
- Centos7安装JDK8以及环境配置
- iPhone企业应用实例分析之一:系统介绍和需求及主要用例
- Python 十六进制数与ascii码的转换
- 系统JNI调用和使用
- Redis解决高并发问题
- scl语言用plc脉冲做定时器_scl语言用plc脉冲做定时器_西门子PLC SCL语言开发学习笔记(二)...
- mac打开注册机显示“您没有权限来打开应用程序
- 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 NN 个 1 到 1000 之间的随机整数(N \leq 100N≤100),对于其中重复的数字,只保留一个,把其余相
- 动态ip代理:保护ip地址,这五种方法请收好
- 创新案例分享 | 统计数据管理与挖掘分析平台助力民生统计
- Taurus.MVC-Java 版本打包上传到Maven中央仓库(详细过程):1、JIRA账号注册
- js和cs的值相互传递和函数的相互调用
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
热门文章
- 三星10年旗舰彻底终结 5年前35次爆炸惊天下
- ModBus的小于3.5S间隔的理解
- Link Cut Tree学习笔记
- 创建一个plugin - drupal 8
- 一步步学习微软InfoPath2010和SP2010--第四章节--处理SP列表表单(6)--列表表单的局限...
- 一个支持Abort的BackgroundWorker
- Xshell的一些实用技巧
- M2 Scrum 12.05
- android 点击跳过,android开发里跳过的坑——button不响应点击事件
- java反射总结_java反射总结