|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
觉得J2EE好像有很多工具,比如servlet,jboss,tomcat,ejb什么的,可是微软的.NET怎么什么也没有啊?微软形式与理论小组公布了叫做Unity大概UnityApplicationBlock的依附注进容器。开辟职员如今可以使用可扩大的轻量级容器创立松耦合使用。InfoQ无机会采访了Unity项目标开辟领头人ChrisTavares。
RobBazinet(RB):Chris先容一下你本人和你是怎样介入Unity的?
ChrisTavares(CT):我的名字叫ChrisTavares。我是微软形式与理论小组的一位初级软件开辟职员。我今朝正在向导EnterpriseLibrary4和UnityApplicationBlock的开辟。我也写了年夜部分的Unity的代码,以是Unity的俊丽都源于我的“毛病”。我已在形式与理论小组事情凌驾2年工夫。在来微软事情之前,我从90年月入手下手处置产业软件外包,盒装软件开辟,乃至一些嵌进式软件开辟。
RB:UnityApplicationBlock是甚么?
CT:Unity是一个依附注进(DependencyInjection,DI)容器。DI的尺度形貌文章来自MartinFlower[0]【译者注:中文译文拜见[4]】。作为一个疾速的择要,依附注进容器就是一个用于构建高度松耦合的软件的工具。依附注进容器处置互相联系关系对象的一切细节,因而你能够构建一个自力的组件。这对可测试性和天真性方面有很年夜的影响。
比方在一个银行体系的,你能够有一个对象,办理帐户转帐。要完成这个方针,必要取得团体账户的对象,再加上平安划定规矩及审计方面的请求。一般的完成看起来是如许的:- AccountTransfer{TransferMoney(sourceAccountNumber,destAccountNumber,amount){AccountsourceAccount=AccountDatabase.GetAccount(sourceAccountNumber);AccountdestAccount=AccountDatabase.GetAccount(destAccountNumber);sourceAccount.Withdraw(amount);destAccount.Deposit(amount);Logger.Write(,amount,sourceAccountNumber,destAccountNumber);}}
复制代码 能够设想,这是相称可骇的代码(比方没有事件办理),固然其能够一般事情。;-)
这是很复杂的,但也是高度耦合的。全局的AccountDatabase类挪用意味着你乃至不克不及独自编译,更别提举行测试了。假如帐号是来自两个分歧的银行会产生甚么呢?一样的,全局的日记纪录器意味着你必需先取得一个某个明白全局纪录器类所创立日记纪录器后,才干利用这个类。这一了局在当你实验编写单位测试的时分是很疾苦的,并且从久远来看也极年夜地限定了天真性。
职责分别准绳请求一个类不要有多个职责。在这里,这个类违背了这一准绳,不但体贴怎样转移资金的细节,并且还要晓得怎样从数据库中猎取帐号和怎样写日记信息。为了恢复天真性,这些职责必要分别到分歧的对象,然后在经由过程传送回这个对象来利用它们,看起来像如许:- AccountTransfer{IAccountRepositoryaccounts;ILoggerlogger;AccountTransfer(IAccountRepositoryaccounts,ILoggerlogger){.accounts=accounts;.logger=logger;}TransferMoney(sourceAccountNumber,destAccountNumber,amount){AccountsourceAccount=accounts.GetAccount(sourceAccountNumber);AccountdestAccount=accounts.GetAccount(destAccountNumber);sourceAccount.Withdraw(amount);destAccount.Deposit(amount);logger.Write(,amount,sourceAccountNumber,destAccountNumber);}}
复制代码 如许加倍关闭。如今我们不依附于内部的全局对象,只是经由过程机关函数传送对象实例。这个类如今能够被独自测试,乃至能够经由过程复杂地传进分歧的IAccountRepository完成来和分歧银行举行交互。
不外,如今有了新的价值。AccountTransfer的创立者如今必需晓得怎样创立所依附的对象。你利用哪一个帐号数据库?谁人日记纪录器?假如这些都是经由过程设置来创建,比方如今你的代码依附于设置而且从头计划。
这就是依附注进容器义不容辞的,它是一个智能的对象工场。你告知容器怎样办理特定对象的依附干系。比方利用Unity,你能够像如许设置容器(利用API,也能够撑持内部设置文件):- IUnityContainercontainer=UnityContainer();container.RegisterType();container.RegisterType();
复制代码 这告知容器”假如一个依附于IAccountRepository实例的对象,就创立一个ContosoBankRepository实例并利用它,假如任何一个对象必要一个ILogger实例,就给它一个DatabaseLogger。”你如今能够像如许请求容器给你一个由依附干系的实例对象:Resolve办法的挪用试图创立一个AccountTransfer实例。容器看到机关函数必要一个IAccountRepository和一个ILogger实例,因而它创立了那些对象(利用先前指定的特定范例)并经由过程机关函数传送给AccountTransfer实例。这是使用容器会合构造你的使用程序的办法。这在你的使用程序中供应了一个中央处置对象之间的挂接,而且开释了对象图上独自对象的机关。由此发生的天真性不管是可测试性仍是天真性真的长短常值得。假如你的类的依附干系产生改动,这其实不影响对象的创立,只必要设置容器就能够。
RB:Unity是EnterpriseLibrary的一部分仍是独自公布?从我看过的材料来看,MicrosoftDependencyInjectionBlock是作为EnterpriseLibrary4.0的一部分来公布的。
CT:Unity是独自公布的。EnterpriseLibrary4.0是创建在Unity之上的,你能够经由过程Unity会见EnterpriseLibrary的功效。
必要申明一点的是,在EnterpriseLibrary2和CompositeUIApplicationBlock(CAB)公布的时分,这两个上面的引擎是一个叫做ObjectBuilder的类库。ObjectBuilder是一个用来构建依附注进容器的框架。CAB和EnterpriseLibrary都利用ObjectBuilder,可是OB是本人自力的工具,厥后被独自公布[1]。
新版本的ObjectBuilder是Unity的一部分。EnterpriseLibrary4仍是和之前一样利用ObjectBuilder:读取设置并创建得当的EnterpriseLibrary对象。我们也引进了一种新的体例来会见EnterpriseLibrary的功效,间接经由过程容器而不是把那种机制埋没起来。ScottDensmore的一篇博客[2]具体的形貌我们正在企图的事情细节。
因而,再次重申:Unity是作为一个自力的全体。EnterpriseLibrary利用了Unity的一部分大概是可经由过程Unity利用。为了节俭下载的贫苦,EnterpriseLibrary包括Unity的二进制程序集。因而假如你体贴的是在EnterpriseLibrary中利用,已为你筹办好了,不必要安装分外的工具。
RB:在甚么情况下,开辟职员选择利用Unity?
CT:第一个成绩是你是不是想利用依附注进。假如是的话,我想Unity是一个很好的选择,可是我也倡议你评价一下其他的容器。ScottHanselman列出了一些现.NET依附注进容器项目[3]。
RB:Unity和其他的依附注进容器有甚么分歧和和他们比拟怎样?
CT:从形式与理论下去说,在这个成绩上我要十分当心。我不想给人如许的印象——不是赞成就是否决人们利用其他的项目。我们激烈倡议人人评价本人的选择,并选择满意必要的最好的容器,不论是Unity仍是现有的开源项目。
RB:已有相称多的依附注进容器,又是甚么念头使得你们团队创立了Unity?
CT:形式与理论一向环绕依附注进供应引导有一段工夫了。CAB、MobileClientSoftwareFactory、SmartClientSoftwareFactory、WebClientSoftwareFactory和EnterpriseLibrary都以“各类”体例利用依附注进。最初一个词“各类”是致命的。固然每一个项目都创建在ObjectBuilder之上,利用依附注进体例都是分歧和不相容地。有一个明白的,功效完全的容器关于我们环绕依附注进供应更好的引导和基于容器的基本架构。
另有其他的缘故原由,我们有的客户不管甚么缘故原由,不会往打仗开放源代码的软件。具有一个由微软供应撑持的容器使得他们有更年夜的平安感,并让他们失掉优点。假如他们未来选择利用其他的容器也使他们处于有益位置。
另外一个方针是进步依附注进容器在微软表里的利用。有一个微软供应的容器有助于依附注进在宽大微软.NET社区和微软外部开辟职员的利用。
RB:关于开辟者和团队以最好的体例入手下手利用Unity有甚么倡议?
CT:抓紧下载,安装它并通读文档,并从我们已公布的复杂疾速指南入手下手。
RB:有无Unity疾速指南和最好理论的示例代码?
CT:我们已有一个WindowsForms使用(红绿灯摹拟器)小例子,使用容器注进服务。这其实是一个小型和相称简单的例子,包含C#和VB.NET版本代码。
RB:Unity有甚么企图?
CT:没有甚么事刻舟求剑的,固然我团体的方针是增添一些特征(有才能拦阻办法挪用是列表中第一流其余),和取得将来的形式与理论的资产以标准基于容器的基本架构。一个更好的文件设置体系。
从久远来看,我喜好以公道的体例找一些大概一切这些观点都转换成中心平台。
RB:Chris,感谢你承受我们的采访和这些Unity的主要信息。
从Unity的网站上看,Unity是:
UnityApplicationBlock(Unity)是一个轻量级的,可扩大的依附注进容器.它有助于构建松耦合的使用程序和为开辟者供应以下便当:
- 简化对象的创立,出格在分层对象布局和依附的情况下
- 它撑持需求的笼统化,这同意开辟职员在运转时或在设置文件中指定依附,简化横切存眷点(crosscuttingconcerns)的办理
- 它经由过程把组件设置推给容器来决意,增添了天真性
- 服务定位才能;这使客户端可以存储或缓存容器
开辟者应看Unity先容对Unity有个整体的懂得入手下手进修Unity。关于UnityApplicationBlock的更多信息可参看形式与理论网站,并能够从CodePlex网站下载。读者能够到Chris的博客。EnterpriseLibrary4.0的依附注进公布在InfoQ2007年12月份的文章叫做微软EnterpriseLibrary4.0将撑持依附注进
[0]http://martinfowler.com/articles/injection.html
[1]http://www.codeplex.com/ObjectBuilder
[2]http://blogs.msdn.com/scottdensmore/archive/2008/01/31/enterprise-library-4-now-with-more-peace-love-and-rock-n-roll.aspx
[3]http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
[4]http://www.openbeta.cn/InversionOfControlContainersAndTheDependencyInjectionPattern.ashx
检察英文原文:MicrosoftUnityDependencyInjectionApplicationBlockReleased
来自:http://www.infoq.com/cn/news/2008/04/microsoft-unity
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着net网页编程嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 |
|