conf 参数 dconf one 依据 泛型类 以及 没有
网上关于 Unity IOC 容器使用的方法已很多,但未能做一个总结,故我这里总结一下,方便大家选择。
首先讲一下通过代码来进行类型映射,很简单,代码如下
- unityContainer =newUnityContainer();//实例化一个容器
- unityContainer.RegisterType(); //注册类型映射unityContainer.Resolve();//解析并获取类型的实例
然而实际情况,我们一般不可能直接硬编码在程序中,因为像上述代码上与普通的直接 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 > (); //解析并实例化一个对象
- //以下是采用独立的配置文件(如: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 容器通过配置实现类型映射的几种基本使用方法
来源: http://www.bubuko.com/infodetail-2036447.html