我们的软件是一个定制的人力资源管理系统(HRMS),使用ASP.NET和Oracle作为数据库,现在我们正在努力使其成为支持多个拥有自己数据库的租户的产品。
我们的选择:
使用NHibernate支持多个数据库并使用OO。但我们关注的是NHibernate学习曲线以及我们遇到的任何问题。
制作一个通用的DAL,它将继续使用存储过程与Oracle合作,并使用工具将其转换为其他数据库,如SQL Server或MySql。必须支持单个脚本的多个依赖于数据库的版本存在风险。
提供软件即服务(SaaS)并维护我们开展业务的方式。但是,可能有客户不希望或信任云或其他SaaS业务模型。
考虑到这一点,什么是最好的数据访问层技术?
答案 0 :(得分:3)
我建议你花时间学习NHibernate它有很多选项可以查询和更新使数据库无关的数据库,这意味着你只需要编写一组脚本,例如HQL。
我会推荐Nhibernate by Example这是一本很棒的书,可以帮助你。
答案 1 :(得分:3)
我想说NHibernate在第一次观看时令人印象深刻,而且看起来非常复杂。因此,在快速阅读了大约260页的介绍文档,并坚持我需要在测试应用程序中执行的任务之后,NHibernate才真正成为可能。如果您不熟悉XML映射文件,只需使用FluentNHibernate,它允许您使用OOP映射业务域对象。
此外,如果你对NHibernate不是很放心,而是选择另一种方式,那么Enterprise Library 4.1 (October 2008)可能是一个有用的工具。根据具体情况,在某些组织中,我选择了NHibernate - Enterprise Library方法的混合体。企业库中的数据访问应用程序块(DAAB)非常容易学习,除了您已经知道的内容之外,您不需要学习任何东西。您只需要知道从DatabaseProviderFactory类创建DbConnection的对象是什么,以便从配置文件中读取,您可以指定默认数据库。
至于我的顾虑,我经常同时使用NHibernate和Enterprise Library。例如,DAAB允许我为每个配置文件指定数据库连接,因为我更喜欢每个文件只引用一个连接。这允许我不为不完全改变的配置部署不必要的配置文件,并且只为另一个连接部署新的配置文件。因此,如果您将必须连接到其他地方的新模块合并到另一个数据存储区,则可以在不关心其余数据的情况下构建模块,使用模块的DLL以及新的DAAB配置文件更新软件。
至于NHibernate,不要做的一件重要事情就是在你不再需要的时候摆脱ISessionFactory。实例化成本很高,因此您希望将其保留在内存中。您可以做的是序列化您的配置对象类(因为它是Serializable),因此您的应用程序只有在您的NHibernate配置文件中更改了某些内容时才能构建其配置。然后,我建议您使用NHibernate的默认hibernate.cfg.xml配置文件,这样您就不需要在更新时反复部署app.config文件。
我希望这有帮助!如果您需要更多信息,请与我们联系。
答案 2 :(得分:0)
我们有一个类似的场景“HRM + ASP.NET +多DB支持”,我们选择了MyGeneration的dOOdads架构,产品已经发布并且运行良好!
只是google for MyGeneration,你就可以开始了!
关于SaaS:是的,许多客户不会接受在云上拥有数据,无论其安全性如何。在市场上享有盛誉后,您可以说服其中一些客户。因此,在第一阶段,重点关注支持“内部部署”作为高优先级的设计,将Saas作为第二优先事项。如果“内部部署”不是一个选项,你最好咨询SaaS营销顾问。
答案 3 :(得分:0)
对于需要支持多个数据库供应商的任何大型项目(超过20个表?)的定制构建ORM,使用NHibernate几乎肯定会比开发成本和学习曲线更便宜。我不知道如何回应你名单上的第3项,因为我不知道如何比较你今天所做的任何事情来使用NHibernate。你今天所做的一切都有可能比NHibernate更好,但你没有提供足够的信息。根据技术决策将自己锁定在特定的业务模型中是一项冒险的业务决策,以后撤销可能会很昂贵。
答案 4 :(得分:0)
我会选择#3选项,因为它可以让您最早进入市场,并希望能够创造强大的收入来源。客户将更愿意资助将现有的成功产品转换为独立系统,而不是建议的产品。您还将从真实用户那里获得宝贵的反馈,以改进产品。您可能会发现不需要独立系统。
如果你是从头开始我会建议学习NHibernate。
答案 5 :(得分:0)
我认为一切都取决于优先事项!
根据我的经验,我总是会考虑这样一个事实:系统的任何部分都可以改变,因此至少会记住系统如何与其他数据库一起工作并继续前进。
显然,如果你有足够的时间和金钱,请尽量选择你最熟悉的东西,然后再适应/重构。您可以在开发它们时在后面的组件中引入NHibernate / IOC,然后返回并重构。