标签:
? ?
今天组内交流Spring.net,被队友吐槽表达不清晰。恩,确实表达能力不行,还是写下来吧。
首先,假设我们要在 UI项目中写一个窗体,用来显示和修改系统用户,可能会有下面的代码。
上面的代码乍看 没有问题,但实际上已经有了隐形的耦合。不管这里的UserBLL是NHiberate实现、EF实现、Linq2Sql…,总而言之!UserBLL已经悄悄的用自己的实现方式限制了FrmUser窗体,如果UserBLL的方法 中有用到第三方 Dll,那UI项目也要引用 。这样写最大的问题是:FrmUser的功能都依赖于UserBLL实现,即UI项目依赖于BLL项目,假如现在的UserBLL是EF实现的,有一天我新建了一个NHUserBLL,用NH实现,必须将UI项目所有的UserBLL替换成NHUserBLL.........
?
实际上UI项目就像是客户,客户只提需求就行了,不关注具体实现方式(到底是EF还是NHiberate实现数据访问)。在代码上,我们可以定义一个IUser做为UI项目所提出的需求,这样就实现控制反转了:不管你的BLL是用EF还是NH,反正要想给调用,就先实现我的接口IUser~~~~~~~~~~~~当然,我们不会让让BLL项目引用UI项目,所以IUser会放在另一个新建项目里。
让后代码就会变成这样
吗?当然不是!!!如果这样写,UI项目还是有对BLL项目的依赖。解决的办法有两个:工厂模式和IOC框架,上代码:
?
大名鼎鼎的工厂模式,没什么好说的,核心思想是把依赖都集中到了工厂上。
?
Spring.net实现,反正是解耦了,原理和教程网上很多~~~~~~~~~~~~~~~~~~
?
标签:
原文地址:http://www.cnblogs.com/wocaca/p/4312254.html