码迷,mamicode.com
首页 > 其他好文 > 详细

IOC个人 理解

时间:2015-03-04 06:13:26      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

? ?

今天组内交流Spring.net,被队友吐槽表达不清晰。恩,确实表达能力不行,还是写下来吧。

首先,假设我们要在 UI项目中写一个窗体,用来显示和修改系统用户,可能会有下面的代码。

  1. public partial class FrmUser : Form
  2. {
  3. ? ?
  4. ????UserBLL _userBLL=new UserBLL();
  5. ? ?
  6. ????public FrmUser()
  7. ????{
  8. ????????InitializeComponent();
  9. ????}
  10. .....
  11. }

上面的代码乍看 没有问题,但实际上已经有了隐形的耦合。不管这里的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会放在另一个新建项目里。

让后代码就会变成这样

  1. public partial class FrmUser : Form
  2. {
  3. ?
  4. ????private IUserBLL _userBLL=new UserBLL();
  5. ?
  6. ????public FrmUser()
  7. ????{
  8. ????????InitializeComponent();
  9. ????}
  10. ????.......
  11. }

吗?当然不是!!!如果这样写,UI项目还是有对BLL项目的依赖。解决的办法有两个:工厂模式和IOC框架,上代码:

?

  1. public partial class FrmUser : Form
  2. {
  3. ?
  4. ????private IUserBLL _userBLL=DataAccess.CreateUserBLL();//工厂模式
  5. ?
  6. ????public FrmUser()
  7. ????{
  8. ????????InitializeComponent();
  9. ????}
  10. ????.......
  11. }

大名鼎鼎的工厂模式,没什么好说的,核心思想是把依赖都集中到了工厂上。

?

  1. public partial class FrmUser : Form
  2. {
  3. ?
  4. ????public FrmUser()
  5. ????{
  6. ????????InitializeComponent();
  7. ????}
  8. ?
  9. ?
  10. ????public List<User> GetUser()
  11. ????{
  12. ?????????IApplicationContext ctx = ContextRegistry.GetContext();//初始化IOC容器
  13. ?????????IUserBLL _userBLL=ctx.GetObject("UserBLL") as IUserBLL;;
  14. ????}
  15. ????.....
  16. }

Spring.net实现,反正是解耦了,原理和教程网上很多~~~~~~~~~~~~~~~~~~

?

IOC个人 理解

标签:

原文地址:http://www.cnblogs.com/wocaca/p/4312254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!