|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
它有很多缺点的,有兴趣可以到网上去搜索一下。于是微软有发明了“下一代”C++:C++/CLI语言,这个可以解决在.NETFramework中,托管C++产生的问题。在《程序员》杂志上,lippman和李建中合作连载介绍了C++/CLI语言。我在写《DependencyInjectionin.NET》时常常碰着的一个反响是“你怎样把依附注进写成一整本书?”这类难以相信的反响是很天然的,假如你以为依附注进的次要形式(机关函数注进)十分简单了解。
固然这个次要形式易于了解,却很难乐成完成依附注进,由于这个机制只是一个更年夜的高低文里的一部分。DI是对把持反转(IoC)准绳的使用,想要乐成完成IoC,你就要把你的头脑逆转过去。这篇文章勾勒了乐成完成DI所需的心智模子。
松懈耦合:依附注进vs.服务定位器
假如你不睬解DI的目标,就很简单把它完成错。这是我比来看到的一个例子:
privatereadonlyILoglog;
publicMyConsumer(ILoglog)
{
this.log=log??LogManager.GetLogger("My");
}
从封装的角度来看,这个计划的次要成绩是MyConsumer类仿佛没法断定它是不是对日记程序这个依附的创立具有把持权。固然这个示例很复杂,但假如LogManager前往的ILog实例包装了一个非托管资本,必要在不利用的时分开释失落,那就有大概演化成一个成绩。
如许的完成之以是会呈现,是由于开辟者把全体精神放在让MyConsumer能够举行单位测试。如许做的来由是开辟者只想在单位测试的时分能够交换ILog,别的情形应当利用LogManager前往的实例。
这实践上就是BastardInjection反形式。个中一个潜伏成绩是它很简单违背里氏代换准绳,由于某个特定的完成失掉了特别看待。
DI(DependencyInjection,依附注进)的目标比起纯真地帮忙举行单位测试要普遍的多。它的目标是完成松懈耦合,以便提拔全部办理计划的可保护性。(假如你想晓得为何松懈耦合可以增添可保护性,我的书的第一章会商了这个话题,你能够收费下载试读。)
松懈耦合可被概述为基于接口而不是详细完成举行编程的头脑。可是,由于接口没有机关函数,怎样创立那些接口的实例即刻就成了一个成绩。
依据你的编程体例,有两种完整分歧的计划能够猎取接口的实例:
关于后面的示例,很简单就会演化成服务定位器(ServiceLocator)反形式,像如许:- publicMyConsumer(){this.log=Locator.Resolve<ILog>();}
复制代码 除服务定位器的别的成绩,这类计划的成绩还在于LogManager.GetLogger("My")办法挪用所需的参数丧失了。假定别的consumer对象必要的日记程序是经由过程分歧的参数实例化的,那末这个版本的服务定位器就没法事情了。
这一般会招致定位器的Resolve办法有一个或多个重载版本,以便向服务定位器供应高低文信息。如许,离违背里氏代换准绳就不远了。
DI供应了一个更好的计划:- privatereadonlyILoglog;publicMyConsumer(ILoglog){if(log==null)thrownewArgumentNullException("log");this.log=log;}
复制代码 这是把持反转的地道情势。ILog的任何完成都能承受,同时经由过程前提语句包管这个实例不为null。这跟利用服务定位器相反,高低文没有在构建对象图的时分丧失。- varconsumer=newMyConsumer(LogManager.GetLogger("My"));
复制代码 在创立MyConsumer的实例时,卖力创立的代码晓得这个特定的consumer对象利用哪一个完成ILog接口的类,因而能够依据高低文供应准确的完成。
DI和服务定位器是完成松懈耦合的两种互斥计划。手艺上,两种都是可行的,但DI没有服务定位器的弱点。
DI的独一弱点是它不像服务定位器那样易于了解。想要乐成完成DI,你必要克制一些停滞。
通往依附注进的坎坷之路
进修DI的个中一个应战,也是你起首碰着的最难的成绩:怎样猎取一个接口的实例?好动静是一旦你了解机关函数注进只是复杂地经由过程机关函数哀求一个实例,你就超过了这个最困难的停滞。
接上去的应战对照简单办理,今后一个加倍简单。我喜好把这些应战设想成你必要攀越的山。第一个又高又陡,但下一个会对照简单,从那以后很快就会变得平展:
在乐成完成DI的路上,你的第一个停滞是了解经由过程机关函数注进把构建consumer对象及其依附的义务托付给第三方。这个第三方就是对象组合的根(CompositionRoot),它是使用程序里的一个自力的点,全部对象图都是在这里构建的。由于对象组合的根卖力构建全部对象图,以是它把握了全部高低文,这使它能够对谁依附谁这个成绩做出明智的决意。
这大概吓跑了一些开辟者,由于他们惧怕这会招致功能成绩,但现实并不是云云。
关于年夜多半人来讲,第二个停滞多是某个依附切实其实定必要一个运转时的值。这类情形一般产生在某个依附要等用户在用户界面上做出特定的选择时才干断定。关于这类情形,笼统工场一般是一个办理计划。
依据我的履历,开始的两个停滞是最难克制的。别的应战也会呈现,但一样平常都是一般征象。在我的书的第六章里,我搜集了人们大概碰着的罕见成绩,和办理它们的举措。
不论如何,一旦你对DI构成了准确的心智模子,任何应战都能容易办理的。
关于作者
MarkSeemann是AutoFixture的创作者,也是《DependencyInjectionin.NET》的作者。他是一个专业的软件开辟者和架构师,他住在丹麦的哥本哈根,今朝是一家丹麦征询公司Commentor的软件架构师。他喜好浏览、画画、弹吉他、好酒和美食。
检察英文原文:SucceedingwithDependencyInjection
因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如net网页编程改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。 |
|