没有ORM的ABP

问题描述

我最近偶然发现ABP(以前称为Asp.Net BoilerPlate)是一种以模块化方式重建Web应用程序的框架。确实,这非常有趣,并且附带了很多基本元素,例如身份验证,日志记录,安全性,多租户,设置等...

但是,据我所了解,ABP与EF Core或Dapper“紧密结合”,而且我不喜欢在代码中使用ORM,我有一个更“数据库驱动”的方法,并且喜欢自己写查询

因此,主要问题是:是否可以通过EFCore / Dapper使用ABP WITHOUT ?还是改用其他模块化框架,例如 orchardcore ExtCore

编辑:@hikalkan回复后,2020年11月11日。

您好,@ hikalkan,谢谢您的答复。也许我需要解释更多我想要实现的目标,以便您可以更好地建议我。我的目标是创建一个“可插拔”网络应用程序,在其中可以用功能相同但细节不同的模块替换模块。

一些简介:我有一个针对中小型公司的人事部门的“复杂”网络应用程序,许多客户使用它,并且每个人都在其场所安装了自己的副本。该应用程序由许多功能组成:个人数据,合同数据,培训数据,轮班等等。但是每个客户都有稍微不同的模块,而应用程序本身是一个古老的,整体的模块:它可以工作,但我必须维护不同的版本,几乎每个客户都使用一个版本,这非常困难且耗时。不要怪我,我已经“继承”了该应用程序,必须以这种方式进行维护和改进。

但是,最后,我可以花一些时间从头开始重建它,并且我希望它是“模块化的”,以便主体部分(身份验证,配置文件数据库交互,主题,安全性,日志记录等)。 )保持稳定可靠,在所有安装中共享,每个客户都有选择的模块/插件供您选择。有点像wordpress,但是更好。

例如,假设我有一个用于管理联系人(电子邮件,电话号码,传呼机等)的简单模块“ contactSimple”,每个联系人在数据库中都有一个类型和一个值字段,非常基本,并且为90我的客户百分比对此感到满意。但是其余的10%希望添加注释字段,标记为“主要联系人”或其他较小的更改。现在,我想做的是:将“ contactEnhanced”模块开发为一个分离类类库,具有与“ contactSimple”相同的接口和主要功能,将其编译为dll,只需在网络应用中更改dll,更新数据库,如果需要的话,重新加载应用程序并进行新的dll操作,而无需更改任何其他组件。

我当时想简单地使用动态反射来获取它,但是后来我发现反射不是很适合,因为资源太慢且占用大量资源,因此在网上冲浪时我会找到ABP。

现在,问题是:您认为ABP是我正在寻找的框架/解决方案吗?请让我知道!

解决方法

ABP旨在独立于数据库提供程序。当前,它具有两个数据库提供程序集成选项:EF Core和MongoDB。这意味着ABP与EF Core或Dapper没有牢固地结合:它也与MongoDB一起使用。如果您已经使用ABP CLI创建了解决方案,则可以设置-d mongodb

因此,框架本身与任何数据库提供程序都没有关系。但是预建模块有。例如,ABP提供了一个身份模块,该模块具有用户和角色管理功能,并且需要数据库,并包括一些与数据库进行交互的代码。因此,它不能独立于数据库提供程序。所有预构建的模块都提供EF Core和MongoDB集成软件包。

如果要使用这些模块(从启动模板创建新应用程序时,某些模块已预先安装),则必须决定使用EF Core或MongoDB进行这些模块的数据库操作。

关于您自己的应用程序代码:您可以自由使用任何方法,包括带有手动SQL查询的ADO.NET。只需按照常规应用程序中的方法进行操作即可。如果要隔离数据库查询,请创建自己的存储库类。这样,您就不会在代码中看到ORM。但是这些模块仍然使用EF Core或MongoDB。

实际上,有可能完全删除EF Core引用:自己实现预构建模块所需的所有存储库。然后它们将起作用,因为它们仅依赖于存储库接口。

顺便说一句;如果您使用OrchardCore,它将uses YesSQL(是,YES SQL)作为核心依赖项,您将无法更改它,因为所有OrchardCore框架都依赖于它。另外,OrchardCore依赖于UI:它使用aspnet核心MVC / Razor Pages UI,而ABP Framework独立于UI,并提供3种内置选项:Angular,MVC和Blazor。

修改:修改问题后

您所解释的故事是ABP框架的目标之一。 ABP是高度模块化的,也是可扩展的。我们将所有模块构建为可扩展的。例如,the module entity extension system允许您向模块的现有实体(该模块用作NuGet包)添加新属性,而无需触摸其源代码。您可以覆盖模块的服务器端逻辑。 但是模块化通常很难。我的意思是模块也应该设计成可扩展/可替换的。如果要为模块声明一些接口,那么该模块可以完全替换,则有很多限制。例如,您不能将SQL连接查询写入该模块的表中(因为替换模块可以使用其他表结构)。 但是,如果自定义设置较轻,则可以遵循ABP框架的模块设计,以使模块可扩展/可定制。请参见https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Guidehttps://docs.abp.io/en/commercial/latest/guides/customizing-modules(由于商业文档现在可以作为开源使用,因此它们将被移至开源一侧)。顺便说一句,ABP支持从文件夹将模块作为dll加载。它会读取dll并在应用程序初始化时初始化模块。

我只能解释ABP的功能。不幸的是,我无法提出建议。因为一个现实生活中的项目很复杂,而且我无法预测您将来会遇到的所有问题和要求:)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...