【问题标题】:What is a good approach for a Data Access Layer?数据访问层的好方法是什么?
【发布时间】:2011-01-09 11:25:59
【问题描述】:

我们的软件是一个定制的人力资源管理系统 (HRMS),使用 ASP.NET 和 Oracle 作为数据库,现在我们实际上正在努力使其成为支持多个租户拥有自己的数据库的产品。

我们的选择:

  1. 使用 NHibernate 支持多个数据库和 OO 的使用。但是我们关注与 NHibernate 学习曲线相关的问题以及我们面临的任何问题。

  2. 制作一个通用 DAL,它将继续使用存储过程与 Oracle 合作,并使用工具将其转换为其他数据库,例如 SQL Server 或 MySql。必须支持单个脚本的多个依赖于数据库的版本存在风险。

  3. 提供软件即服务 (SaaS) 并维护我们开展业务的方式。但是,可能有客户不想要或不信任云或其他 SaaS 业务模型。

考虑到这一点,最好的数据访问层技术是什么?

【问题讨论】:

    标签: .net asp.net orm data-access-layer data-access


    【解决方案1】:

    我们有一个类似的场景“HRM + ASP.NET + 多数据库支持”,我们选择了 MyGeneration 的 dOOdads 架构,该产品已经发布并且运行良好!

    只需在 Google 上搜索 MyGeneration,您就可以开始了!

    关于 SaaS:是的,许多客户不会接受在云上存储数据,无论其安全性如何。在市场上享有声誉后,您可以说服其中一些客户。所以在第一阶段的重点是支持“内部部署”作为高优先级和 Saas 作为第二优先级的设计。如果“内部部署”不是一种选择,您最好咨询 SaaS 营销顾问。

    【讨论】:

    • 我想大多数时候我们还需要更改 MyGeneration 生成的内容,不是吗?此外,您是否为 DAL 制作了一个通用类,或者您创建了类或添加了处理不同表或包的代码(在 oracle 的情况下)
    • MyGeneration 是一个代码生成器,而不是 ORM。如果你想要一个代码生成器,那很好,但你应该先选择一个 ORM。使用没有 ORM 的代码生成器等同于编写具有所有缺点的自定义 ORM。
    • 当你想开发一个支持多数据库的系统时,你不得不用大量的代码弄脏你的手!在我们在 mygeneration 之上开发了我们的框架之后,只需几个小时我们就可以将系统从一个数据库转移到另一个数据库。我们最常在“MySQL、MS-SQL 和 Oracle”之间交换。因此,在您调整手中的工具后,开发将很好地进行流式传输。 “在我们构建框架后,开发人员能够在一到两个小时内创建包含完整 CRUD 操作的定义屏幕!”
    【解决方案2】:

    我建议您花时间学习 NHibernate,它有许多用于查询和更新数据库的选项,使其与数据库无关,这意味着您只需编写一组脚本,例如 HQL。

    我会推荐 Nhibernate by Example,这是一本很好的书。

    【讨论】:

      【解决方案3】:

      对于需要支持多个数据库供应商的任何大型项目(超过 20 个表?),使用 NHibernate 几乎肯定会比定制构建的 ORM 更便宜(从开发成本和学习曲线的角度来看)。我不知道如何回应您列表中的第 3 项,因为我不知道如何将您今天所做的事情与使用 NHibernate 进行比较。有可能您今天所做的任何事情实际上都比 NHibernate 更好,但是您在这方面没有提供足够的信息。将自己锁定在基于技术决策的特定商业模式中是一个冒险的商业决策,而这在以后撤销的成本可能很高。

      【讨论】:

        【解决方案4】:

        我会选择选项 3,因为这可以让您最早进入市场,并有望开始一个强劲的收入来源。与提议的产品相比,客户将更愿意资助将现有的成功产品转换为独立系统。您还将从真实用户那里获得宝贵的反馈,从而改进产品。而且您可能会发现没有对独立系统的需求。

        如果您是从零开始,我建议您学习 NHibernate。

        【讨论】:

          【解决方案5】:

          我认为这完全取决于优先级!

          根据我的经验,我总是会考虑系统的任何部分都可以更改的事实,因此至少会始终牢记系统将如何与其他数据库一起工作并继续前进。

          清楚地使用您最了解的内容,然后在您有时间和金钱时进行调整/重构。您可以在开发它们时在以后的组件中引入 NHibernate/IOC,然后返回并重构。

          【讨论】:

            【解决方案6】:

            我会说 NHibernate 乍一看令人印象深刻,而且学习起来似乎很复杂。因此,在快速阅读了大约 260 页的介绍文档并坚持我需要在测试应用程序中执行的任务之后,NHibernate 确实是要走的路。如果您不喜欢 XML 映射文件,只需使用FluentNHibernate,它允许您使用 OOP 来映射您的业务域对象。

            此外,如果您对 NHibernate 并不完全满意并且更喜欢另一种方式,Enterprise Library 4.1 (October 2008) 可能是一个有用的工具。根据情况,在某些组织中,我选择了 NHibernate - Enterprise Library 的混合方法。 Enterprise Library 中的数据访问应用程序块 (DAAB) 非常容易学习,除了您已经知道的内容外,您不需要学习任何内容。您只需要知道使用什么对象从 DatabaseProviderFactory 类创建 DbConnection 以读取配置文件,并且您可以指定默认数据库。

            至于我的顾虑,我经常同时使用 NHibernate 和 Enterprise Library。例如,DAAB 允许我为每个配置文件指定一个数据库连接,因为我更喜欢每个文件只参数一个连接。这使我不必为根本没有更改的配置部署不必要的配置文件,而只为另一个连接部署新的配置文件。因此,如果您合并一个必须连接到另一个数据存储的新模块,您构建模块而不关心其余部分,使用模块的 DLL 以及这个新的 DAAB 配置文件更新您的软件。

            对于 NHibernate,不要做的重要事情是在不再需要 ISessionFactory 时将其删除。实例化成本很高,因此您希望将其保存在内存中。不过,您可以做的是序列化您的配置对象类(因为它是可序列化的),因此您的应用程序只有在您的 NHibernate 配置文件发生更改时才能构建其配置。再说一次,我建议你为 NHibernate 使用默认的 hibernate.cfg.xml 配置文件,这样你就不需要在更新时一遍又一遍地部署你的 app.config 文件。

            我希望这会有所帮助!如果您需要更多信息,请告诉我。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-19
              • 2016-07-10
              • 2010-09-08
              • 2020-02-01
              • 2019-06-27
              • 2016-04-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多