网上关于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 ,如需转载请自行联系原作者