[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

   在上一篇文章中,我简单介绍Unity的一些背景知识、为什么要使用Unity和使用Unity有什么好处。今天将继续学习Unity,主要是了解Unity的一些常见的使用方法。

本篇文章将主要介绍:

Unity中的UnityContainer基本使用介绍,包括UnityContainer类的常用方法介绍,并且通过几个小例子来介绍具体的使用方法,这些例子都会以代码及配置文件两种方式来实现。

 

      从UnityContainer(Unity容器)这个类的名称中我们就可以看出其是Unity最重要的类,UnityContainer就像Unity的一个司令部,而一个个对象就像一名名士兵,每个士兵来去都需要通过UnityContainer来管理,其掌管了所有对象的依赖关系,所有对象的创建都会通过这个Unity容器来创建,,同时也可以说是一个外交部,对于我们开发者,我们不需要关心内部是怎么实现的,我们只需要事先设置好对象之间的关系,然后在需要的时候告诉UnityContainer我需要什么,UnityContainer就会将我们需要的直接发给我们。(这些比喻可能不正确,但是是我能想到的最好的比喻了)

使用代码实现对象关联注册:

首先来看一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  interface  IClass
{
     void  ShowInfo();
}
public  class  MyClass : IClass
{
     public  MyClass()
     {
 
     }       
 
     public  void  ShowInfo()
     {
         Console.WriteLine( "这个是我的班级" );
     }
}
具体调用:
1
2
3
4
5
static  void  Main( string [] args)
{
     IClass classInfo = new  MyClass();
     classInfo.ShowInfo();
}

这个是最常见的接口及其实现类的使用方法,定义一个接口,然后再定义一个类来实现这个接口,然后在具体使用的过程中,可以通过new关键字来实例化具体来实现接口,虽然没有语法上的问题,但是这样会造成紧耦合,如果一旦具体的实现类发生了改变,则就需要修改代码,而且如果这种类似的代码很多,则会导致整个项目的变动,甚至出现异常,所以我们需要使用IOC来解耦,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
public  static  void  ContainerCode()
{
     IUnityContainer container = new  UnityContainer();
     container.RegisterType<IClass, MyClass>();
     //另一种注册方法,不过没有RegisterType<>()方法来的方便
     //container.RegisterType(typeof(IClass), typeof(MyClass));
     IClass classInfo = container.Resolve<IClass>();
     //另一种通过container获取具体对象的方法
     //IClass classInfo = container.Resolve(typeof(IClass));
     classInfo.ShowInfo();
}

使用Unity来管理对象与对象之间的关系可以分为以下几步:

1、创建一个UnityContainer对象。

2、通过UnityContainer对象的RegisterType方法来注册对象与对象之间的关系。

3、通过UnityContainer对象的Resolve方法来获取指定对象关联的对象。

 

使用配置文件来实现对象关系注册:

以上是通过代码的方式来注册对象之间的关系,但是对于一个项目来说,正式部署后,由于代码都编译成DLL,如果要修改依赖关系则修改代码并重新编译,相对来说太麻烦了,所以Unity还提供配置文件配置的方式来配置对象之间的关系,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? xml  version="1.0" encoding="utf-8" ?>
< configuration >
   < configSections >
     < section  name="unity"
              type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
              Microsoft.Practices.Unity.Configuration"/>
   </ configSections >
   < unity  xmlns="http://schemas.microsoft.com/practices/2010/unity">
     < alias  alias="IClass" type="UnityStudyConsole.IDemo.IClass, UnityStudyConsole" />
     < alias  alias="MyClass" type="UnityStudyConsole.Demo.MyClass, UnityStudyConsole" />
     
     < container >
       < register  type="IClass" name="ConfigClass" mapTo="MyClass" />
     </ container >
   </ unity >
</ configuration >

具体代码调用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  static  void  ContainerConfiguration()
{
     IUnityContainer container = new  UnityContainer();
     //获取指定名称的配置节
     UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection( "unity" );
     //默认方法,默认获取名称为"unity"配置节下配置信息
     container.LoadConfiguration();
     //获取已命名的配置节<container name="FirstClass">下的配置信息
     container.LoadConfiguration( "FirstClass" );
     //获取特定配置节下配置信息
     container.LoadConfiguration(section);
     //获取特定配置节下已命名的配置节<container name="FirstClass">下的配置信息
     container.LoadConfiguration(section, "FirstClass" );
 
     IClass classInfo = container.Resolve<IClass>( "ConfigClass" );
     classInfo.ShowInfo();
}

通过配置文件配置Unity信息需要有以下几个步骤:

1、在配置文件中<configSections> 配置节下unity注册。

2、在<configuration> 配置节下添加Unity配置信息。

3、在代码中读取配置信息,并将配置载入到UnityContainer中。

使用配置文件来配置对象信息虽然可以在部署的时候更改对象之间的依赖关系,但是当系统过于复杂,则就会导致配置文件的增大,所以我们需要将Unity的配置信息从App.config或web.config中分离出来,但是这样的话前面的代码中调用方法就无效了,我们现在需要修改一下现有的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  static  void  ContainerConfigurationFromFile( string  configFile)
{
     //根据文件名获取指定config文件
     var  fileMap = new  ExeConfigurationFileMap { ExeConfigFilename = configFile };
     //从config文件中读取配置信息
     Configuration configuration =
         ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
     var  unitySection = (UnityConfigurationSection)configuration.GetSection( "unity" );
 
     var  container = new  UnityContainer()
         .LoadConfiguration(unitySection, "FirstClass" );
 
     IClass classInfo = container.Resolve<IClass>( "ConfigClass" );
     classInfo.ShowInfo();
}

由于Unity配置相对来说比较复杂,一下子难以上手,而且不像企业库的其他模块可以通过配置工具进行配置,所以p&p小组为了方便通过配置文件进行Unity配置,已经在企业库5.0的安装包中内置了UnityConfiguration20.xsd,你可以在X:\Program Files\Microsoft Visual Studio X.0\Xml\Schemas\下找到,这样就可以在配置文件中进行Unity配置时出现只能提示了,如下图:

pic70

需要注意的是,如果想出现这种提示,需要在新增的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)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(2)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(3)

第十步、使用Unity解耦你的系统—PART3——依赖注入

第十步、使用Unity解耦你的系统—PART4——Unity&PIAB

扩展学习:

扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]



本文转自kyo-yo博客园博客,原文链接:http://www.cnblogs.com/kyo-yo/archive/2010/11/08/Learning-EntLib-Tenth-Decoupling-Your-System-Using-The-Unity-PART2-Learn-To-Use-Unity-One.html,如需转载请自行联系原作者


目录
相关文章
|
2月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
93 0
|
3月前
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
141 0
|
3月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
79 0
|
3月前
|
图形学
Unity动画☀️Unity动画系统Bug集合
Unity动画☀️Unity动画系统Bug集合
|
4月前
|
数据可视化 vr&ar C#
|
5月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
136 2
|
5月前
|
Rust 图形学
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
109 1
|
5月前
|
图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱10(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱10(附带项目源码)
42 1
|
5月前
|
图形学
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(下)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
77 0
|
5月前
|
图形学 容器
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统(上)
【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统
71 0