总结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 的 ...
随机推荐
- Visual Studio Xamarin编译Android项目出错的解决办法
安装完Xamarin后,编译Android项目时,你会发现好长时间进度都不动,当你取消编译后,会发现其实是出错了,就是因在Android项目在第一次编译时要去google网站上下一个andorid s ...
- centos 安装ffmpeg
wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz tar -zxvf ffmpeg-3.1.tar.gz cd ffmpeg-3.1 ./co ...
- 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.4,增加系统设置、最近联系人、群功能(源码)
自从上次版本(GG叽叽V3.2,增加离线消息.离线文件功能)发布后,我个人觉得主要的大功能都实现得差不多了,接下来的几个版本将不断优化GG的细节,提高其可用性.这次版本更新的内容主要是为GG增加了系统 ...
- node(规则引擎)
本文主要记录node的下的一个开源规则引擎nools,给出简单的实例,github地址为: https://github.com/C2FO/nools 定义规则引擎(test.nools) defin ...
- 用“MEAN”技术栈开发web应用(二)express搭建服务端框架
上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ...
- java实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
package JingDian; import java.util.Scanner; public class charKind { public static void main(String[] ...
- 生成格式化的json
public static ContentResult returnJson(object obj) { var content = new ContentResult() { Content = J ...
- IOS 多线程04-GCD详解 底层并发 API
注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大量的复杂度和更多的责任.在我们的文章常见的后台实践 ...
- IOS 其它语言比较-Objc与JAVA的比较
1. Objc是一门编译型语言,JAVA是解析型语言 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运行这个程序. 编译型语言,执行速度快.效率高:依赖编译器.跨平台性差些. ...
- 如何获得PRINCE2认证
PRINCE2认证考试共有两种:基础级和从业级 一. 基础级考试 基础级考试是一种低水平的认证.如果想要进行从业级考试,必须要参加并通过该考试,或者已经获得pmp资质.基础级考试包括以下关键点: 1. ...