c# - 是否可以在 Asp.net Core 解决方案的单独层中管理 DBContext 的注入(inject)

标签 c# asp.net .net-core n-tier-architecture

我们的 asp.net 核心解决方案分为以下几层:

Web UI 项目(3 种不同的 Web 应用程序)

BLL

实体(模型和 View 模型)

DAL(DBContext、存储库)


所有 Web UI 都将利用来自 BLL 的服务,BLL 又会引用 DAL 来与数据交互。通常,在启动类中配置 DBContext 的服务。

有没有办法真正将其分开,以便 Web UI 项目在仍然使用 DI 的同时不需要引用 DAL(DBContext)?我知道要发生依赖注入(inject),DBContext 需要在启动 Web UI 时配置为作用域服务,但从逻辑上讲,UI 需要引用或与DAL.

最佳答案

我推荐使用这些图层:

  1. Web UI(具有验证属性的模型 - 数据格式、必需等)
  2. 服务
    • 合约DLL(接口(interface)+实体)
    • 实现(控制者行为)
  3. 数据访问

在服务和 Web UI 之间共享合约 DLL。在服务内部使用您喜欢的任何 DAL/ORM。就个人而言,我更喜欢Dapper .

然后,使用 Refit 为您的 JSON 服务生成 C# 代理.通过网站的 Startup 类将 Refit 代理注入(inject)您的网络 Controller 。将大部分业务逻辑放在服务 Controller 中,并从网站 Controller 中调用它们。将网站 Controller 中的逻辑保持在最低限度。

通过这种设计,Web UI 不了解数据访问层。如果您愿意,可以将它从 Dapper 切换到 Entity Framework。 Refit + JSON 服务为您提供了两端(Web 和服务)类型安全的 C# 代码的好处,以及在需要时灵活地编写原始 HTTP 帖子(例如,从 Web 浏览器中运行的 AJAX 代码)。

您还可以编写利用该服务的 C# 或 PowerShell 实用程序。换句话说,网站不必是服务的唯一消费者。

关于c# - 是否可以在 Asp.net Core 解决方案的单独层中管理 DBContext 的注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49678274/

相关文章:

c# - C# 中的不可变本地值 - 一个特定的用例

c# - 返回嵌套的泛型 Expression<Func<T, bool>>

asp.net - 获取网站根目录的基本 url(绝对/相对 url)

css - Blazor 突出显示选定的表格行

c# - 我们怎样才能返回一个与方法返回类型不同的对象呢?

c# - 提交表单导致 URL 中出现未知代码

c# - 从树结构的每一层获取属性

c# - ASP.net 日历控件的任何免费替代品?

c# - WTSQueryUserToken 返回 FALSE

entity-framework - Microsoft.EntityFrameworkCore.Tools.DotNet v2.0.1