一、 DALFactory主要功能:
1、 相应 DAL 层的类加载将根据 Web.Config 中的应用程序配置(<appSetting>中的WebDAL和OrderDAL)在运行时动态生成
2、 这是一组“加载正确实现”的工厂类,可以确定运行时应该加载哪一个DAL实现
3、 具体过程:
(1) 从配置文件中读入一个值,以确定应该使用“反射”加载的是哪一个程序集
(2) 通过 .NET 的反射命名空间,(可以)加载某个特定(适当的)程序集(SQLServerDAL或OracleDAL),并使用该程序集创建某个对象(如Account类的对象)的实例
二、 实现细节:
1、 这一部分的内容,在资料文档《资料1-数据库可移植性-from PetShop 3.x Architec Doc》,以及代码实例中做出的解释较多
2、 访问流程问题:可以用来修订SQLServer学习笔记中的访问流程
(1) 通过PetShop.DALFactory.Product.Create()选择加载了一个正确的DAL组件(比如SQLServerDAL)
(2) 创建了一个正确的DAL层组件的Product类的实例
(3) 返回了一个该Product类在IDAL层的接口IProduct
3、 Account.cs文件:
4、 读取WebDAL的值,即读取“在对Web进行数据库操作的时候,使用的是哪个数据访问组件”;同样,在Order.cs文件中,读取OrderDAL的值,即读取“在Order进行数据库操作的时候,使用的是哪个数据访问组件”
5、 Assembly.Load()是否是可以代替在VS中一个项目中若想使用另一个项目中定义的类,必须添加另一个项目的应用(右键——添加引用)?
三、 启发:
1、 学习方法问题:现在看的东西比较多,听过的东西也多一些了,明显感觉到,在看一些招聘要求或技术资料的时候,可以找到路子了。但是,由于没有将这些零散的知识串起来,做几个实例,还是不能将知识进行深层次的掌握和理解。所以,学完之后做Demo是非常重要的!
2、 学架构的路子是非常正确的,其实就是应该先解决架构问题,才能理解某些部分的代码为什么要那样实现
3、 在看完了Model、IDAL、Utility、SQLServer_DB Architec和SQLServer后,整个系统底层的内容基本已经学完了,这里有必要重新读一遍《Microsoft .NET PetShop 3.x的设计模式与体系结构》文档,看有哪些内容是我在学习过程中忽略掉的
4、 企业级高容量电子商务解决方案的标准:
(1) 高性能
(2) 可扩展能力,包括增加处理器和使用群集
(3) 支持采用分布式事务,因为有可能需要访问多个数据库
(4) 支持多个数据库供应商
(5) 容易维护
5、 不要总是抱怨自己没有实际经验!经验是可以从每个Demo项目中获得的!!!
四、 问题:
1、 哪里变化封装哪里——封装是否就意味着“进行抽象的过程”?提取出“可能变化部分的公共部分”,针对“公共部分”进行操作,然后采用某种机制(如Reflection)确定应该正确采用的那部分功能
2、 什么不直接返回已经选出来的,适当的DAL组件(如SQLServerDAL)的适当的对象(如Product),而返回了一个该对象在IDAL层的引用?
3、 IDAL层的引进究竟目的何在?是否单纯为了规范下层DAL组件所必须实现的数据访问方法?还是说只要使用工厂模式就必须定义接口,并且即使使用反射确定了应该正确加载的DAL组件的对象,也必须返回对象接口引用?
4、 自己的答案:如果不返回接口,那么上层BLL在得到返回的DAL组件对象之后,就有可能知道在下层究竟使用的是SQLServerDAL还是OracleDAL,这就有可能在BLL层有针对性地进行编程——而这正是使用多层模式想要避免的!!!