具有简洁架构的 Blazor WebAssembly

New*_*ewm 7 blazor blazor-server-side

我正在使用 Blazor WebAssembly 进行概念验证项目。该项目已经有一个 React 前端,我希望在 Blazor 中复制它。

我的解决方案中有以下项目:

  • 域 - 包含实体并且不引用任何其他层
  • 应用程序 - 引用域并包含 DTO、命令/查询(使用 MediatR/Dapper)、验证器(使用 FluidValidation)和后续层实现的接口
  • 持久性 - 引用应用程序并使用 EF Core 将域模型存储在数据库中
  • API - 一种 Web API,它使用 DI 注册所有内容并通过控制器公开来自应用程序层的命令/查询
  • React Front End - 使用 AJAX 与 API 对话

我想在 Blazor WebAssembly 项目中引用应用程序层,以便我可以重用针对 DTO 存在的验证规则。是否有人可以遍历浏览器中的代码并从命令/查询中提取敏感信息,例如连接字符串?

例如,一个简单的查询可能看起来像这样,单步执行代码将允许IDbConnection检查:

public class PayCategoryListQueryHandler
    : IRequestHandler<PayCategoryListQuery, PayCategoryListQueryVm>
  {
    private readonly IDbConnection _connection;

    public PayCategoryListQueryHandler(IDbConnection connection)
    {
      _connection = connection;
    }

    public async Task<PayCategoryListQueryVm> Handle(PayCategoryListQuery query, CancellationToken cancellationToken)
    {
      {
        var viewModel = new PayCategoryListQueryVm();

        viewModel.AddRange(
          await _connection.QueryAsync<PayCategoryListItemDto>(
            "SELECT Id, Description, MakeAttendedTimeZero, IsOffSite, IsVisibleToClient FROM PayCategory ORDER BY Description"));

        return viewModel;
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我是否需要将 DTO 及其验证提取到一个单独的层,该层不包含任何数据库访问代码以防止连接字符串被泄露?

澄清

为了尝试澄清这个问题,我想尝试更好地解释我的情况。

我当前的应用程序使用 React 前端,Formik 和 Yup 提供验证。这意味着每次对验证规则进行更改时,我都需要在两个地方反映它——应用程序层和 React 应用程序。我希望迁移到 Blazor 可以通过只需要在应用程序层维护验证规则来减少重复。

我目前使用的架构基于NorthwindTraders示例应用程序。

使用该示例,CreateCustomerCommand使用CreateCustomerCommandValidator,它将通过CustomersController响应 POST 请求。为了在 Blazor WebAssembly 中使用它进行客户端验证,我目前需要引用应用程序层。

鉴于这种情况,所有命令(不是命令处理程序)和验证器都应该移动到一个单独的项目中,然后 Blazor 可以引用该项目。命令处理程序可以保留在应用程序层,因此删除任何数据库访问代码。

Alo*_*ois 4

创建一个新的dotnet.standard -项目,名称类似于MyProject.Domain.Shared。在那里你放置了所有的通信(poco-)类。

共享项目由您的Domain-ProjectApplication-LayerClient-Layer消耗。领域项目由应用程序层持久层使用。

共享项目中您放置:

  • DTO
  • 要求
  • 回应
  • 验证者

应用程序项目中,您输入:

  • 请求处理程序
  • 响应处理程序

域项目中,您输入:

  • 领域对象
  • 存储库接口
  • 消耗请求并产生响应的处理程序)