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等,这些需依据实际情况来配置,在此不作说明,可参考网上其它牛人的教程。

时间: 2024-10-02 08:52:51

Unity IOC容器通过配置实现类型映射的几种基本使用方法的相关文章

总结Unity IOC容器通过配置实现类型映射的几种基本使用方法

网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择. 首先讲一下通过代码来进行类型映射,很简单,代码如下: unityContainer = new UnityContainer(); //实例化一个容器 unityContainer.RegisterType<IClassTest, ClassTest>(); //注册类型映射 unityContainer.Resolve<IClassTest>();//解析并获取类型的实例 然而实际

Unity IOC注入详细配置(MVC,WebApi)

一直想写一篇关于unity 详细的配置信息的文章,也算是自我总结吧 先介绍了unity , Unity是微软官方推荐使用的轻型的IOC框架,支持各种方式的注入 ,使用来解耦的利器. 获取unity 的方式呢你可以直接下载对应的dll文件或者去对应的网站下载,我个人推荐呢用NuGet直接添加和管理. 添加方式如下图 安装之后呢会自动添加到项目里,当有更新的时候,直接在窗口里面更新就行,或者执行命令行 Update-Package  Mvc{tab} ,如果你只需要注入普通的MVC的话那现在啊就可以

Unity IOC容器的简单应用(转)

转自:http://blog.csdn.net/wanzhuan2010/article/details/7763280 Unity是Unity是微软patterns& practices组用C#实现的轻量级,可扩展的依赖注入容器,它为方便开发者建立松散耦合的应用程序, 有以下优点: 1.简化了对象的创建,特别是针对分层对象结构和依赖关系: 2.需求的抽象,允许开发人员在运行时或配置文件中指定依赖关系,简化横切关注点的管理: 3.推迟为容器配置组件的时机,增加了灵活性: 4.服务定位能力,这使客

介绍 Spring IoC 容器和 bean

简介 本章涵盖了 Spring Framework实现控制翻转 (IoC) 的原则. IoC 有时也被称为依赖注入 (DI).这是一个对象定义他们依赖的过程,其中对象之间的相关性,也就是说,它们一起工作,只能通过构造函数参数,参数工厂方法或设置在其构造后的对象实例或者是从一个工厂方法返回的对象实例的属性上.容器在创建的 bean 注入这些依赖.这个过程是根本的反转,因此称为控制反转(IoC),bean 本身通过直接构造类,或作为 Service Locator(服务定位器)模式的机制,来控制其依

详解Spring IoC容器

一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的设计是非常不利的. 在Spring中,IoC容器是实现依赖控制反转这个模式的载体,它可以在对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖是可以递归的,对象被逐层注入. 关于如何反转对依赖的控制,把控制权从具体业务对象中转交到平

Spring框架学习[IoC容器高级特性]

1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取被管理的Bean时,IoC容器对Bean进行的初始化和依赖注入过程,这些是Spring IoC容器的基本功能特性.Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.FactoryBean产生或者修饰Bean对象的生成.IoC容器初始化Bean过程中使用Bean

Spring框架笔记(十一)——IOC容器创建bean实例的第三种方法——FactoryBean

IOC容器创建bean实例有3类方法: 1 通过bean对应实例的全类名 2 通过工厂方法,包括静态工厂和实例工厂 3 实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean 今天我们介绍这第三种方法--FactoryBean Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法

亚博体育什么是Ioc容器?

亚博体育yb9461分析道:2.1.Ioc容器 BeanFactory: Spring最底层的接口,只提供了的IoC功能,负责创建.组装.管理bean:使用了懒加载,getBean时候才会初始化Bean:ApplicationContext接口:继承了BeanFactory,除此之外还提供AOP集成.国际化处理.事件传播.统一资源加载等功能:在初始化容器的时候就会初始化Bean:1.1.bean实例化方式(需要使用@Autowired注解来声明) 构造器实例化(无参数构造器):静态工厂方法实例化

Spring.net(二)----初探IOC容器

我在上一篇关于Spring.net的文章“Spring.NET框架简介及模块说明 ”中很详细的介绍了,本文就不旧话从提.我门就直奔主题吧. 1.首先了解两个接口.  IObjectFactory接口和IApplicationContext接口:他两个称为“容器”或“IOC容器”. Spring.net框架的核心原则是非侵入性.  IObjectFactory接口是初始化.配置及管理对象的实际容器.  IObjectFactory全限定名为Spring.Objects.Factory.IObjec