是否可以在 Asp.net Core 解决方案的单独层中管理 DBContext 的注入

问题描述 投票:0回答:2

我们的 ASP.NET Core 解决方案分为以下几层:

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

BLL

实体(模型和视图模型)

DAL(DBContext、存储库)


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

有没有一种方法可以真正将其分离,以便 Web ui 项目在仍然使用 DI 的同时不需要引用 DAL (DBContext)?我知道,要发生依赖注入,需要在 Web ui 启动时将 DBContext 配置为范围服务,但从逻辑上讲,UI 需要引用或与达尔。

c# asp.net .net-core n-tier-architecture
2个回答
0
投票

我建议使用这些层:

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

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

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

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

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


0
投票

尽管已经很晚了,但用例仍然存在,这就是我一直在做的事情。我在BAL层创建了一个单独的扩展方法,只是在startup.cs或program.cs中调用了该扩展方法。这样我就不用在UI项目中引用DAL层了,BAL也会有DAL的引用。

BAL > StartUpHelper.cs

public static class StartUpServiceRegisterHelper
{
    public static void RegisterDbContext(this IServiceCollection serviceCollection, string connectionString)
    {
        serviceCollection.AddDbContext<MyDbContext>(option =>
        {
            option.UseSqlServer(connectionString);
        });
    }
}

UI > 程序.cs

builder.Services.RegisterDbContext(builder.Configuration.GetConnectionString("DBConnection"));

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.