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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

网上关于Unity IOC容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择。

首先讲一下通过代码来进行类型映射,很简单,代码如下:

1
2
3
4
unityContainer =  new  UnityContainer();  //实例化一个容器
 
unityContainer.RegisterType<IClassTest, ClassTest>();  //注册类型映射
unityContainer.Resolve<IClassTest>(); //解析并获取类型的实例

然而实际情况,我们一般不可能直接硬编码在程序中,因为像上述代码上与普通的直接new一个实例并无什么区别,都会存在很明显的依赖,若后面需要更换类,则必需修改程序源码,那就失去了IOC的作用了,所以大多都采用外部配置文件来实现自动映射,下面是我总结的几种配置方法(严格意义来讲,还是一种),供大家选择。

第一种配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
< 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表示这个泛型所在的程序集,并不是命名空间哦!

第二种配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
< 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 >

第三种配置如下(其实是上面两种的简写形式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
< 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 >

代码中使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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等,这些需依据实际情况来配置,在此不作说明,可参考网上其它牛人的教程。

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4861594.html  ,如需转载请自行联系原作者

相关文章
|
4月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
107 0
|
5月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
212 3
|
5月前
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
274 0
|
6月前
|
存储 容器
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
35 0
|
6月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
6月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
6月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
6月前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
6月前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)
|
6月前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)

热门文章

最新文章