第十步使用Unity解耦你的系统PART2了解Unity的使用方法2.docx
《第十步使用Unity解耦你的系统PART2了解Unity的使用方法2.docx》由会员分享,可在线阅读,更多相关《第十步使用Unity解耦你的系统PART2了解Unity的使用方法2.docx(15页珍藏版)》请在冰豆网上搜索。
第十步使用Unity解耦你的系统PART2了解Unity的使用方法2
本篇文章将主要介绍:
1、注册对象之间的关系。
2、为已存在的对象注册关系。
3、Unity中LifetimeManagers介绍。
一、注册对象之间的关系
简单介绍了如何使用Unity来注册对象与对象之间的关系,通过RegisterType方法来注册对象之间的关系。
首先来看下类关系图:
有2个接口类:
IClass(班级接口)和ISubject(科目接口),其分别有2个实现类,现在首先要注册班级相关的对象关系,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void RegisterTypeCode()
{
//注册IClass与MyClass之间的关系
//此处为IClass的默认注册,每次调用Resolve都会返回MyClass
container.RegisterType();
//如果再次进行默认注册,将会覆盖原来的注册
//container.RegisterType();
//注册IClass与YourClass之间的关系
//此处多了一个参数"your",表示一个命名注册,只有当调用Resolve("your")时才会返回YourClass
//这种注册方法解决了当需要为某个对象注册多个对应关系时的冲突
container.RegisterType("your");
//获取具体的对象并调用
IClassmyClass=container.Resolve();
IClassyourClass=container.Resolve("your");
myClass.ShowInfo();
yourClass.ShowInfo();
//ResolveAll方法可以一次性获取与IClass有注册关系的非默认对象实例
//也就是已命名注册的对象,所以列表中只有一个对象YourClass
IEnumerableclassList=container.ResolveAll();
foreach (var itemin classList)
{
item.ShowInfo();
}
}
这段代码展示了使用RegisterType方法来注册对象之间的关系,需要注意的是,在进行命名注册的时候,所提供的命名参数是大小写敏感的,所以输入“your”和“Your”表示的不是一个对象注册。
同时这边还展示了如何通过Resolve方法来获取所需的对象,以及使用ResolveAll方法来获取与指定对象关联的所有对象列表。
--来自狗刨学习网
有关RegisterType方法的其他重载我这边就不详细介绍了,可以点此查看详细的重载方法介绍。
接下来看下如何使用配置文件来进行配置(和上一篇的例子类似),配置文件代码如下:
1
2
3
4
5
6
7
8
9
10
11
Verdana;">读取并调用代码如下:
1
2
3
4
5
6
7
8
9
10
public static void RegisterTypeCodeConfiguration()
{
//获取指定名称的配置节
UnityConfigurationSectionsection=(UnityConfigurationSection)ConfigurationManager.GetSection("unity");
container.LoadConfiguration(section,"First");
IClassclassInfo=container.Resolve();
classInfo.ShowInfo();
}
二、为已存在的对象注册关系
在日常开发的过程中我们有时候会自己创建好一个对象,但是你又想对这个已经创建好的对象的生命周期进行管理,这个时候你可以使用Unity提供的RegisterInstance方法,代码示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void RegisterInstance()
{
IClassmyClass=new MyClass();
IClassyourClass=new YourClass();
//为myClass实例注册默认实例
container.RegisterInstance(myClass);
//为yourClass实例注册命名实例,同RegisterType
container.RegisterInstance("yourInstance",yourClass);
container.Resolve().ShowInfo();
container.Resolve("yourInstance").ShowInfo();
}
这段代码很简单,就是通过RegisterInstance方法为已存在的对象进行注册,这样可以通过UnityContainer来管理这些对象实例的生命周期。
需要注意的是,使用RegisterInstance来将已存在的实例注册到UnityContainer中,默认情况下其实用的是ContainerControlledLifetimeManager,这个生命周期是由UnityContainer来进行管理,UnityContainer会维护一个对象实例的强引用,当你将已存在的实例注册到UnityContainer后,每次通过Resolve方法获取对象都是同一对象,也就是单件实例(singletoninstance),具体有关生命周期相关信息在下面进行介绍。
由于RegisterInstance是对已存在的实例进行注册,所以无法通过配置文件来进行配置。
有关RegisterInstance方法的其他重载我这边就不详细介绍了,可以点此查看详细的重载方法介绍。
3、Unity中LifetimeManagers介绍
我们在系统中引入Unity主要就是想通过Unity来解除对象之间的依赖关系,方便我们根据配置调用到所需的对象,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,可能Unity自动维护的生命周期并不是我们想要的,我们想要根据具体的需求来更改这些对象的生命周期,下面我就介绍一下Unity中内置的生命周期管理器。
1、TransientLifetimeManager,瞬态生命周期,默认情况下,在使用RegisterType进行对象关系注册时如果没有指定生命周期管理器则默认使用这个生命周期管理器,这个生命周期管理器就如同其名字一样,当使用这种管理器的时候,每次通过Resolve或ResolveAll调用对象的时候都会重新创建一个新的对象。
需要注意的是,使用RegisterInstance对已存在的对象进行关系注册的时候无法指定这个生命周期,否则会报异常。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
public static void TransientLifetimeManagerCode()
{
//?
?
2?
?
?
?
?
?
?
?
?
container.RegisterType();
container.RegisterType(new TransientLifetimeManager());
Console.WriteLine("-------TransientLifetimeManagerBegin------");
Console.WriteLine("?
?
?
?
?
RegisterType?
?
?
?
?
HashCode:
" +
container.Resolve().GetHashCode());
Console.WriteLine("?
?
?
?
?
RegisterType?
?
?
?
?
HashCode:
" +
container.Resolve().GetHashCode());
Console.WriteLine("-------TransientLifetimeManagerEnd------");
}
配置文件如下:
1
2
3
4
5
-- value="Session#1"typeConverter="SessionLifetimeConverter"/>-->
如果想在配置文件中在在注册关系的时候更改一个生命周期管理器只需在配置节下新增既可(如果不新增则默认使用TransientLifetimeManager)。
其中有3个参数:
1)type,生命期周期管理器的类型,这边可以选择Unity内置的,也可以使用自定义的,其中内置的生命周期管理器会有智能提示。
2)typeConverter,生命周期管理器转换类,用户自定义一个生命周期管理器的时候所创建一个转换器。
3)value,初