DAL层使用抽象工厂是大家再熟悉不过的设计方法了。最近在回顾项目的时候,发现网上流传的方法大多都存在一个不大不小BUG。对于整个系统而言,轻则需要重新更新配置,重则需要重启。

好了废话不多说,先看代码

        private static void GetProvider(){try{_instance = (IDataProvider)Activator.CreateInstance(Type.GetType(string.Format("xxxx", ConnTypeString), false, true));}catch{_instance = null;throw new Exception();}}public static IDataProvider GetInstance(){if (_instance == null){lock (_lockHelper){if (_instance == null){GetProvider();}}}return _instance;}

我相信绝大多数的抽象工厂都是这样写的。因为设计模式的书上也是这样写的,网上能够找到的例子也是这样写的,许多大型项目(譬如DZNT)也是这样写的。

我为什么说这样的设计存在BUG呢?

这还要回到我们使用反射+配置文件+抽象工厂的DAL层的设计初衷。我们不希望把DAL使用何种数据库写死在代码中,而是希望灵活的切换数据库。回头看看代码,似乎没有发现什么问题。再细想“灵活切换数据”,在系统正在运行的时候切换数据库可以吗?答案是不可以。因为系统启动之后instance已经被初始化了,当你再次修改配置信息的时候就不会再次反射出新的instance。所以这里存在这样一个BUG。

修改之后的代码:

        public static IDataProvider GetInstance(){string connType = Configs.GetConfigs().DbConfigInfo.ConnType;if (_currentConnType != connType || _instance == null){lock (_lockHelper){if (_currentConnType != connType || _instance == null){_currentConnType = connType;GetProvider();}}}return _instance;}

你在看完以后可以有种种理由反驳我

  1. “我在修改配置文件的时候直接重置instance就可以了”
  2. “我的程序只需要在启动的时候判断使用什么数据库就足够了,在运行时不会切换数据库”
  3. “切换数据库必须保证数据安全,需要关闭系统,重新备份数据库再启动系统”

我并没有充足的理由回应你的驳斥。后两个观点更有理由让这个BUG存在。的确,在系统中我们没有必要考虑到每一个细节,只要能够让系统按照需求运行正常即可。所以我只想针对第一点说说我的看法。首先DZNT(老版本,新版代码未阅读)就是这样做的,提供了一个Reset重置instance。但这样设计似乎违背了“单一职责原则”,“一个类,最好只做一件事,只有一个引起它变化的原因”。所以在修改配置的时候就不应该去管DAL的事情,DAL的事情应该由DAL自己解决。同时也避免了在配置完数据库类型之后忘记Reset引起的BUG。

转载于:https://www.cnblogs.com/Aimeast/archive/2011/05/14/2046126.html

又一个“众所周知”的DAL层设计BUG相关推荐

  1. mysql dal层_MySQL读写分离的DAL层策略设计

    MySQL读写分离的DAL层策略设计 MySQL读写分离的DAL层策略设计 一 .MySQL集群简介 所谓的mysql集群,是指多台机器完成一个工作,最主要的场景是数据库服务器和Web服务器,但是集群 ...

  2. petshop详解之五:PetShop之业务逻辑层设计

    五 PetShop之业务逻辑层设计业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计 ...

  3. petshop4.0 详解之五(PetShop之业务逻辑层设计)[转]

    业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域( ...

  4. Qomolangma实现篇(三):兼容层设计

    ================================================================================ Qomolangma OpenProj ...

  5. petshop4.0 详解之五(PetShop之业务逻辑层设计)

    五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设 ...

  6. PetShop之业务逻辑层设计

    <解剖PetShop>系列之五 五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的 ...

  7. 基础才是重中之重~如何整理BLL与DAL层的文件

    最近在项目重构过程中,发现项目比较乱,项目中的类文件遍及了整个项目文件夹中,为此,我觉得有必要把它们整理一下,我的作法是: 详细划分: BLL层:根据业务或者领域进行划分,如用户业务,财务业务,产品业 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. [wayfarer]PetShop之业务逻辑层设计

    原文地址: http://www.cnblogs.com/wayfarer/archive/2006/11/05/550723.html <解剖PetShop>系列之五 五 PetShop ...

最新文章

  1. 你还不了解基于session的授权认证吗?
  2. Centos源码安装Cmake
  3. Matlab移植到Eigen用到的词条
  4. 一个离开某门户网站人员自爆黑幕
  5. 安卓如何修改华强北二代耳机敲击指令?
  6. 手把手教你如何优化C语言程序
  7. 归一化处理公式_数学建模中的数据处理——归一化处理
  8. 微信网页支付之H5支付
  9. python字符画绘制代码_python图片转字符画代码是什么
  10. 彩色数字图像处理基础
  11. 进程隐藏技术系列之简介
  12. 苍穹官网HTML源码带音乐
  13. Licecap for Mac使用教程
  14. DeepFashion2: 一个针对衣服图片的检测、姿态估计、分割和重认证多用途基准
  15. Linux下LED灯驱动模板详解
  16. 不做ui了 转行做什么_ui设计师是做什么的 想转行可以吗
  17. 个人介绍静态网页【附源码】初学者的期中作业
  18. auto auto const auto auto
  19. 安信可ESP32-CAM摄像头开发demo--局域网拍照、实时视频、人脸识别
  20. 2022-2028全球激光全息膜行业调研及趋势分析报告

热门文章

  1. window环境下安装Python2和Python3
  2. 杂项:SVN 常用方法
  3. 微信支付get_brand_wcpay_request:fail
  4. 《团队-爬取豆瓣电影TOP250-设计文档》
  5. WebSocket实践
  6. 地铁建设 (Standard IO)
  7. 第十七篇 --ANDROID DisplayManager 服务解析一
  8. 豆米--基于豆瓣API的WP7书籍搜索工具开源啦!
  9. 汉诺塔问题 hdu 2064 hdu1997
  10. HTTP---Cookie