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

推荐订阅源

罗磊的独立博客
Cisco Talos Blog
Cisco Talos Blog
C
Check Point Blog
博客园_首页
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
S
Security @ Cisco Blogs
L
LINUX DO - 最新话题
博客园 - 司徒正美
P
Privacy International News Feed
G
Google Developers Blog
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Scott Helme
Scott Helme
K
Kaspersky official blog
I
InfoQ
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
量子位
H
Hacker News: Front Page
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
SecWiki News
SecWiki News
S
Security Affairs
Latest news
Latest news
人人都是产品经理
人人都是产品经理
C
CERT Recently Published Vulnerability Notes
S
Security Archives - TechRepublic
V
Visual Studio Blog
T
Troy Hunt's Blog
S
Secure Thoughts
F
Fortinet All Blogs
V
V2EX
The Register - Security
The Register - Security
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - FrankFei

创采人力资源管理软件--产品简介 创采e-HR荣获江苏省高新技术产品认定 个人经典收藏网址 创采人事档案管理系统(ASP.NET+ExtJS) 创采应用框架开发平台--CFrame 创采人事管理软件--分布式的人力资源管理解决方案 创采e-HR合作经营 创采人事管理软件 创采人力资源管理系统 使用.Net和ExtJS技术开发的人力资源管理系统 ObjectBuilder中WeakRefDictionary使用模式浅析 ObjectBuilder中IBuilderPolicy和IBuilderStrategy之区别 ObjectBuilder模式浅析 NHibernate连接多数据库字符定义问题 优化GridView的查询、翻页性能 名言警句 折叠内容 [转]NUnit2.0详细使用方法 设计模式--Prototype
ObjectBuilder应用之TypeMappingPolicy、SingletonPolicy
FrankFei · 2007-08-01 · via 博客园 - FrankFei

FrankFei at 2007/08/01

ObjectBuilder中提供了很多Policy,甚至还可以按自己的需要任意扩展,那对于已经提供的Policy,我们应该如何正确的使用呢?这篇文章我会先介绍一下其中的SingletonPolicy。

在我们实际的项目开发中,经常会遇到多次创建同一个类的情况,如果按照一般的方法去new一个类,那么每new一次,就会产生一个实例,对于小型系统完全没有问题,但当系统比较庞大时,就应该认真思考了。

先给大家看一个下面的例子,其中的MyConcreteClass是一个实体类,同时要加上using Microsoft.Practices.ObjectBuilder;。

        static void Main(string[] args)

        
{

            IReadWriteLocator locator;

 

            Builder builder 
= new Builder();

 

            PolicyList policyList 
= new PolicyList();

 

            ISingletonPolicy singletonPolicy 
=new SingletonPolicy(true);

            policyList.Set
<ISingletonPolicy>(singletonPolicy, typeof(MyConcreteClass), "MyClassId");

            locator 
= new Locator();

            LifetimeContainer lifetime 
= new LifetimeContainer();

            locator.Add(
typeof(ILifetimeContainer), lifetime);

            MyConcreteClass myConcreteClass1 
= builder.BuildUp<MyConcreteClass>(locator, "MyClassId"null, policyList);

            MyConcreteClass myConcreteClass2 
= builder.BuildUp<MyConcreteClass>(locator, "MyClassId"null, policyList);

     }


上面写了那么多,在很大程度上和MyConcreteClass myConcreteClass1=new MyConcreteClass();MyConcreteClass myConcreteClass2=new MyConcreteClass();差不多,那为什么要搞得这么复杂呢?现在我们假设MyConcreteClass中有一个字段:public int age,我们把上面的代码改成如下:

        static void Main(string[] args)

        
{

            IReadWriteLocator locator;

 

            Builder builder 
= new Builder();

 

            PolicyList policyList 
= new PolicyList();

 

            ISingletonPolicy singletonPolicy 
=new SingletonPolicy(true);

            policyList.Set
<ISingletonPolicy>(singletonPolicy, typeof(MyConcreteClass), "MyClassId");

            locator 
= new Locator();

            LifetimeContainer lifetime 
= new LifetimeContainer();

            locator.Add(
typeof(ILifetimeContainer), lifetime);

            MyConcreteClass myConcreteClass1 
= builder.BuildUp<MyConcreteClass>(locator, "MyClassId"null, policyList);

            myConcreteClass1.age
=28;

            MyConcreteClass myConcreteClass2 
= builder.BuildUp<MyConcreteClass>(locator, "MyClassId"null, policyList);

           Console.WriteLine(myConcreteClass2.age.ToString());

     }


运行上面的代码,我们发现myConcreteClass2.age.ToString()也是28,由此可见myConcreteClass1和myConcreteClass2它们其实是同一个实例(即Singleton模式已经生效)。所以在使用SingletonPolicy时对于引用类型要清楚上面的情况,以便正确使用。

对于细心的读者可能会提出这样一个问题,那如果我有两个类MyConcreteClass和MyConcreteClass1,它们都继承于MyAbstractClass,那我是不是要把上面的代码Copy一份,然后把其中所有的MyConcreteClass改为MyConcreteClass1呢?虽然可以那样做,但显然不是好的方法,所以在ObjectBuilder中又引入了一个Policy:TypeMappingPolicy,下面是使用TypeMappingPolicy后的代码:

static void Main(string[] args)

        
{

            IReadWriteLocator locator;

 

            Builder builder 
= new Builder();

 

            PolicyList policyList 
= new PolicyList();

            ITypeMappingPolicy typeMappingPolicy
=new TypeMappingPolicy(typeof(MyConcreteClass),"MyClassId");

            ISingletonPolicy singletonPolicy 
=new SingletonPolicy(true);

            policyList.Set
<ITypeMappingPolicy>(typeMappingPolicy, typeof(MyAbstractClass), "MyClassId");

            policyList.Set
<ISingletonPolicy>(singletonPolicy, typeof(MyAbstractClass), "MyClassId");

            locator 
= new Locator();

            LifetimeContainer lifetime 
= new LifetimeContainer();

            locator.Add(
typeof(ILifetimeContainer), lifetime);

            MyAbstractClass myConcreteClass1 
= builder.BuildUp<MyAbstractClass>(locator, "MyClassId"null, policyList);

            MyAbstractClass myConcreteClass2 
= builder.BuildUp<MyAbstractClass>(locator, "MyClassId"null, policyList);

     }


现在如果我要创建MyConcreteClass1,只要把上面的ITypeMappingPolicy typeMappingPolicy=new TypeMappingPolicy(typeof(MyConcreteClass),"MyClassId");改为ITypeMappingPolicy typeMappingPolicy=new TypeMappingPolicy(typeof(MyConcreteClass1),"MyClassId");即可,这样是不是在某种程度上更符合面向对象的一些原则呢!

 关于TypeMappingPolicy和SingletonPolicy就说到这里,以上只是我个人的理解,不当之处请指教!