总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择。
首先讲一下通过代码来进行类型映射,很简单,代码如下:
unityContainer = new UnityContainer(); //实例化一个容器 unityContainer.RegisterType<IClassTest, ClassTest>(); //注册类型映射
unityContainer.Resolve<IClassTest>();//解析并获取类型的实例
然而实际情况,我们一般不可能直接硬编码在程序中,因为像上述代码上与普通的直接new一个实例并无什么区别,都会存在很明显的依赖,若后面需要更换类,则必需修改程序源码,那就失去了IOC的作用了,所以大多都采用外部配置文件来实现自动映射,下面是我总结的几种配置方法(严格意义来讲,还是一种),供大家选择。
第一种配置如下:
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections> <unity>
<typeAliases>
<typeAlias alias="IRepository`1" type="ConsoleApplication1.DDD.Interface.IRepository`1,ConsoleApplication1" />
<typeAlias alias="Post" type="ConsoleApplication1.Entities.Post,ConsoleApplication1" />
<typeAlias alias="Category" type="ConsoleApplication1.Entities.Category,ConsoleApplication1" />
<typeAlias alias="Author" type="ConsoleApplication1.Entities.Author,ConsoleApplication1" />
<typeAlias alias="IClassTest" type="ConsoleApplication1.DDD.Interface.IClassTest,ConsoleApplication1" />
</typeAliases>
<container>
<types>
<type type="IRepository[Post]" mapTo="ConsoleApplication1.DDD.Infrastructure.Repositories.PostRepository,ConsoleApplication1" />
<type type="IRepository[Category]" mapTo="ConsoleApplication1.DDD.Infrastructure.Repositories.CategoryRepository,ConsoleApplication1" />
<type type="IRepository[Author]" mapTo="ConsoleApplication1.DDD.Infrastructure.Repositories.AuthorRepository,ConsoleApplication1" />
<type type="IClassTest" mapTo="ConsoleApplication1.DDD.Interface.ClassTest,ConsoleApplication1" />
</types>
</container>
</unity>
注意配置中的[]方括号表示的是泛型参数,typeAliases->typeAlias中的type及types->type中的mapTo均需配置类型的完整限定名以及类型所在的程序集,中间以逗号分隔,比如:ConsoleApplication1.DDD.Interface.IRepository`1 表示一个IRepository<T>泛型类型,而ConsoleApplication1表示这个泛型所在的程序集,并不是命名空间哦!
第二种配置如下:
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections> <unity>
<aliases>
<add alias="IRepository`1" type="ConsoleApplication1.DDD.Interface.IRepository`1,ConsoleApplication1" />
<add alias="Post" type="ConsoleApplication1.Entities.Post,ConsoleApplication1" />
<add alias="Category" type="ConsoleApplication1.Entities.Category,ConsoleApplication1" />
<add alias="Author" type="ConsoleApplication1.Entities.Author,ConsoleApplication1" />
<add alias="IClassTest" type="ConsoleApplication1.DDD.Interface.IClassTest,ConsoleApplication1" />
</aliases>
<container>
<register type="IRepository[Post]" mapTo="ConsoleApplication1.DDD.Infrastructure.Repositories.PostRepository,ConsoleApplication1" />
<register type="IRepository[Category]" mapTo="ConsoleApplication1.DDD.Infrastructure.Repositories.CategoryRepository,ConsoleApplication1" />
<register type="IRepository[Author]" mapTo="ConsoleApplication1.DDD.Infrastructure.Repositories.AuthorRepository,ConsoleApplication1" />
<register type="IClassTest" mapTo="ConsoleApplication1.DDD.Interface.ClassTest,ConsoleApplication1" ></register>
</container>
</unity>
第三种配置如下(其实是上面两种的简写形式):
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections> <unity>
<assembly name="ConsoleApplication1"></assembly>
<namespace name="ConsoleApplication1.Entities"></namespace>
<namespace name="ConsoleApplication1.DDD.Interface"></namespace>
<namespace name="ConsoleApplication1.DDD.Infrastructure.Repositories"></namespace>
<container>
<register type="IRepository[Post]" mapTo="PostRepository" />
<register type="IRepository[Category]" mapTo="CategoryRepository" />
<register type="IRepository[Author]" mapTo="AuthorRepository" />
<register type="IClassTest" mapTo="ClassTest" ></register>
</container>
</unity>
代码中使用方法:
unityContainer = new UnityContainer();
unityContainer.LoadConfiguration();//如果配置中指定了容器节点的名字name,则需要指定名字 unityContainer.Resolve<IRepository<Post>>();//解析并实例化一个对象 //以下是采用独立的配置文件(如:unity.config)的使用方法:
IUnityContainer container = new UnityContainer();
string configFile = "Unity.config";
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile };
//从config文件中读取配置信息
Configuration configuration =ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
//获取指定名称的配置节
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
//载入名称为FirstClass 的container节点
container.LoadConfiguration(section, "MyContainer");
从配置的内容来讲,一看就知道是第三种配置比较的高效与简洁,其实现原理也很简单,就是将需要映射的相关类型的程序集及所在命名空间先全部定义在unity节点中,然后就可以直接配置注册映射,当然上面的配置都很简单,没有包含其它一些属性,比如配置lifetime、constructor等,这些需依据实际情况来配置,在此不作说明,可参考网上其它牛人的教程。
总结Unity IOC容器通过配置实现类型映射的几种基本使用方法的更多相关文章
- Unity IOC容器通过配置实现类型映射的几种基本使用方法
		
网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下 unityContainer = new Uni ...
 - 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入
		
前言:在C/S架构上,WPF无疑已经是"桌面一霸"了.在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用.但是WPF也有很多年的历史了,并且基于MVVM ...
 - Spring Ioc容器xml配置
		
Spring Ioc容器xml配置基本结构: <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
 - Castle IOC容器构建配置详解(二)
		
主要内容 1.基本类型配置 2.Array类型配置 3.List类型配置 4.Dictionary类型配置 5.自定义类型转换 一.基本类型配置 在Castle IOC的配置文件中,大家可能都已经注意 ...
 - Castle IOC容器构建配置详解(一)
		
主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...
 - Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean
		
Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean. 工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一 ...
 - Spring IoC容器 XML 配置与加载
		
IoC 容器 XML 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
 - Unity IOC容器的简单应用(转)
		
转自:http://blog.csdn.net/wanzhuan2010/article/details/7763280 Unity是Unity是微软patterns& practices组用 ...
 - Unity IOC注入详细配置(MVC,WebApi)
		
一直想写一篇关于unity 详细的配置信息的文章,也算是自我总结吧 先介绍了unity , Unity是微软官方推荐使用的轻型的IOC框架,支持各种方式的注入 ,使用来解耦的利器. 获取unity 的 ...
 
随机推荐
- ListView 加载更多列表 Load More mono forandroid 项目笔记
			
今天项目经理找我说Listview加载更多的时候会出现一些问题,主要表现在会顿一下.让我我就去找Java的方法看看.自己写出了mono 的加载更多功能.和大家分享一下 先看效果 首先是模型类ListI ...
 - Sensor(GYROSCOPE)
			
package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...
 - 渣渣小本求职复习之路每天一博客系列——Java基础(9)
			
———————————————————————今天不闲聊————————————————————————————— 第十一章:线程 第四节:synchronized与同步 首先,我们来看一段代码: p ...
 - [ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)
			
综述:USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式.两个USART具有同样的功能,可以设置在单独的I/O 引脚. 1.UART 模式 UART 模式 ...
 - 【译】用jQuery 处理XML--写在前面的话
			
用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...
 - 为什么Java方法里面不能再嵌套方法?
			
直接原因: 这是Java基本语法定义的,方法中不可以再次声明方法,只能调用其他的方法. 个人理解: 1.方法栈是需要一个载体的,这个载体就是Class,如果一个方法的上一级不是一个类,就说明没有载体. ...
 - PsySH:PHP交互运行环境
			
是什么 我们经常会在命令行用到诸如mysql.python等命令,特点是一旦输入后,会进入命令本身的交互运行环境.示例: [root@iZ25vs3mckhZ ~]# python Python 2. ...
 - Apache多站点实现原理和配置
			
Apache多站点实现原理 很多人常常看到一台服务器上跑多个站点,不同的域名访问不同的站点,就会有个疑惑:访问的时候并没有在地址栏中加入端口号,多个域名都是解析到这个服务器的IP地址,服务器怎么能够正 ...
 - android   股票数据通过日K获取周K的数据  算法 源码
			
目前的数据是从新浪接口获取的, http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sh600000&end ...
 - rabbitMQ第四篇:远程调用
			
前言:前面我们讲解的都是本地服务器,现在如果需要远程计算机上运行一个函数,等待结果.这就是一个不同的故事了,这种模式通常被称为远程过程调用或者RPC. 本章教程我们使用RabbitMQ搭建一个RPC系 ...