惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
L
Lohrmann on Cybersecurity
Vercel News
Vercel News
P
Palo Alto Networks Blog
P
Proofpoint News Feed
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
K
Kaspersky official blog
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
L
LangChain Blog
Y
Y Combinator Blog
T
Tenable Blog
腾讯CDC
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
NISL@THU
NISL@THU
A
Arctic Wolf
Security Latest
Security Latest
IT之家
IT之家
Latest news
Latest news
Cisco Talos Blog
Cisco Talos Blog
P
Privacy & Cybersecurity Law Blog
T
Tor Project blog
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
Last Week in AI
Last Week in AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
AWS News Blog
AWS News Blog
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
量子位
T
Troy Hunt's Blog
Blog — PlanetScale
Blog — PlanetScale
V
Vulnerabilities – Threatpost
I
InfoQ
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
Intezer
爱范儿
爱范儿
C
Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

博客园 - 赤脚小子

Workflow WF Reference Links for 2009-03-20 Workflow WF Reference Links for 2009-03-06 Workflow WF Reference Links for 2009-02-20 Workflow WF Reference Links for 2009-02-13 Workflow WF Reference Links for 2009-02-06 Workflow WF Reference Links for 2009-02-01 Workflow WF Reference Links for 2009-01-16 Workflow WF Reference Links for 2009-01-09 Workflow WF Reference Links for 2008-12-30 WF书籍导读(完整版) WF书籍推荐 Unity(七):使用场景Ⅲ:用于依赖注入(下) Unity系列目录 Unity(六):使用场景Ⅲ:用于依赖注入(上) Unity(四):使用场景Ⅰ:建立类型映射 Unity(三):快速入门 Unity(二):Unity是什么? Unity(一):从ObjectBuilder说起 Exception Management in .NET阅读笔记
Unity(五):使用场景Ⅱ:用于单例模式
赤脚小子 · 2008-04-28 · via 博客园 - 赤脚小子

我们说到哪了...

          对于Unity的底层构件ObjectBuilder

          介绍了Unity的特性。

          给出一个简单使用Unity的简单示例,对Unity的使用有一个初步的认识和了解。

          介绍了如何使用Unity建立类型的映射。

单例模式

有关单例模式本身,我想就不用我在这里多说了,它可以说是模式中最简单的一个了。我只是想谈谈我对这个模式的一点想法。

为了实现单例模式,我们通常的做法是,在类中定义一个方法如GetInstance,判断如果实例为null则新建一个实例,否则就返回已有实例。但是我觉得这种做法将对象的生命周期管理与类本身耦合在了一起,与SRP原则相违背。所以我觉得遇到需要使用单例的地方,应该将生命周期管理的职责转移到对象容器上,而我们的类依然是一个干净的类。

为了接下来的说明,我们先编写几个后面需要的接口和类:

准备工作

IOrder接口、CommonOrder类、VipOrder类:

image

image

image

将Unity应用于单例模式,主要有两种使用场景:

(1)将类型注册为单例;

(2)将已有对象注册为单例。

将类型注册为单例

与上一篇文章建立类型映射类似,我们可以将一个接口注册为标识键,对应一个具体类。不同的是,要用于单例模式,我们需要使用一个LifetimeManager类型的参数,并指定为ContainerControlledLifetimeManager类型:

RegisterType<TFrom, TTo>(new ContainerControlledLifetimeManager())

以下的代码以接口注册为例,演示了如何为一个接口注册一个具体类,并声明为单例:

image

image 

同样,我们可以为一个基类注册一个具体类,与前述的类似,如:
container.RegisterType<Order, CommonOrder>(new ContainerControlledLifetimeManager());
我们还可以把某个类直接注册为单例,而不进行类型的映射,如:
container.RegisterType<CommonOrder>(new ContainerControlledLifetimeManager());

这里需要指出的是:默认情况下,直接使用RegisterType(不指定LifetimeManager),然后Resolve所得到的对象的生命周期是短暂的,容器并不保存对象的引用,每次调用Resolve方法我们都会得到一个新对象。然而,当我们指定了ContainerControlledLifetimeManager参数后,容器在第一次调用Resolve方法时会创建一个新对象,此后在每次调用Resolve时,都会返回之前创建的对象。

除此之外,Unity还扩展了单例的使用方式。例如,我需要把某个类设计为单例,但是发现在应用中我们需要这个类的两个单例,分别有不同的用途,这时,使用Unity的类型与名称组合的标识键,就可以满足这种使用场景。使用方式如下(以接口为例):

image

ps:使用类型与名称的组合的例子可以参见前面一篇文章,大致相同。

同理,我们也可以用基类和名称的组合为标识键注册具体类,还可以直接把某个类和名称组合进行注册。这里不再赘述。

将已有对象注册为单例

如果我们已经创建了一个对象,并希望使用已创建的对象作为单例,而不是由容器新创建一个对象,那么我们应该使用RegisterInstance方法。以下的代码以接口注册为例,演示了如何使用一个已有对象,为一个接口注册一个具体类,并声明为单例:

image

image

将已有对象注册为单例,同样也支持前面提到的几种使用方式,如注册基类、使用名称等,也就不再重复了。