ylbtech-范例-项目-.NET-PetShop-4.0-架构设计:依赖注入 |
1. 依赖注入返回顶部 |
1、
依赖注入
- “抽象”的概念非常重要,但不管怎样抽象,最终还是需要具体的实现。例如前面介绍的插入订单的策略,我们提供了IOrderStrategy接口。然而对于BLL层来说,需要插入订单时,我们仍然要创建具体的OrderStrategy对象,也就是说下面的代码是不可避免的:
- IOrderStrategy orderInsert = new OrderSynchronous();
- 这样一来,BBL中仍然为具体的OrderSynchronous对象所制约。
2、
- 理想的情况是,具体对象的创建永远都不要在代码中实现。也就是说,模块与模块之间的依赖,由原来的内部依赖,转移到外部。
- 依赖是必须的,一旦转移到外部,就需要将该依赖注入到模块中,这就是所谓的“依赖注入(Dependency Injection)”。
- 关于“依赖注入”,Martin Fowler有很好的文章来介绍,可以访问:http://martinfowler.com/articles/injection.html
- 对于“依赖注入”,有一些轻量级容器已经实现。如Spring,PicoContainer等。在.Net平台下,也有Spring.Net等容器支持。
- 但究其根本,实际上还是通过反射来完成对依赖的注入,如果不使用这些轻量级容器来专门完成“依赖注入”的话,我们也可以引入反射和xml配置文件来解除模块对具体对象的依赖。
- 在PetShop中,这种方式随处可见。例如在DALFactory中的DataAccess类(参见代码)。
3、
- 由于PetShop是一个Asp.Net的应用系统,所以配置信息都可以放在Web.Config文件下。然后,通过ConfigurationManager来获取,例如:
- private static readonly string orderPath = ConfigurationManager.AppSettings["OrdersDAL"];
- 在Web.config的配置如下:
- <add key="OrdersDAL" value="PetShop.SQLServerDAL"/>
4、
- 如果我们的数据访问层,需要访问Oracle数据库,则只需要修改web.config中的配置:
- <add key="OrdersDAL" value="PetShop.OracleDAL"/>
- 而DALFactory中的代码根本不需要改变。
- 这个方法就可以解决前面提到的OrderStrategy的问题。在BBL的Order类中,需要调用IOrderStragety对象,以此来插入订单。方法是:
- private static readonly PetShop.IBLLStrategy.IOrderStrategy orderInsertStrategy = LoadInsertStrategy();
5、
private static PetShop.IBLLStrategy.IOrderStrategy LoadInsertStrategy() { // Look up which strategy to use from config file string path = ConfigurationManager.AppSettings["OrderStrategyAssembly"]; string className = ConfigurationManager.AppSettings["OrderStrategyClass"]; return (PetShop.IBLLStrategy.IOrderStrategy)Assembly.Load(path).CreateInstance(className); }
6、
- IOrderStrategy对象通过LoadInsertStrategy()方法来创建。它读取了配置节OrderStrategyAssembly和OrderStrategyClass,然后利用反射创建该对象。
- 而在web.config中,配置如下:
- <add key="OrderStrategyAssembly" value="PetShop.BLL"/>
- <add key="OrderStrategyClass" value="PetShop.BLL.OrderSynchronous"/>
- 如果需要修改插入订单的策略为异步,仅需要修改为:
- <add key="OrderStrategyClass" value="PetShop.BLL. OrderAsynchronous"/>
- 这样自然就解决了具体对象创建的问题,利用配置文件和反射实现了依赖的注入。
7、
2.返回顶部 |
3.返回顶部 |
4. 附返回顶部 |
1、附
PetShop代码及相关文档链接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet.asp
PetShop 4.0 download:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp
PetShop 3.0 download:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet3.asp
PetShop 4.0是在.Net Framework 2.0下开发的。之前的3.0,2.0版本则可以在.Net Framework 1.x下运行。
如果是.Net 1.x,建议参考PetShop 3.0
PetShop 4.0引入了许多.Net 2.0具有的特性,如泛型、Transacation、Asp.Net 2.0 MemberShip等特性。
2、
5.返回顶部 |
6.返回顶部 |
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 |