具有 2 个前端应用程序(Blazor 服务器和 Angular)的项目的建议体系结构,带有 EFCore、Identity、Mediatr

Suggested architecture for a project with 2 Frontend applications (Blazor Server and Angular) with EFCore, Identity, Mediatr

我目前正在和一个同学一起做一个学校项目。我们决定对管理客户端 (Blazor Server) 和成员客户端 (Angular) 进行经典设置。

到目前为止,我们在解决方案中有 7 个项目:

Solution
├───Project.MemberClient (Angular)
├───Project.AdminClient (Blazor Server)
├───Project.Api (REST API)
├───Project.Application (CQRS & Mediatr)
├───Project.Core (Entities, Enums, Interfaces)
├───Project.Infrastructure (Database Context & Migrations)
└───Project.Test

我们正在为数据库使用 EntityFramework,API 和 Blazor 服务器都可以通过 Mediatr 访问该数据库。

不幸的是,我们无法就如何处理 API.

的使用达成协议。
  1. 我的同学确信 Blazor Server 客户端和 Angular 客户端都应该通过 REST API。
  2. 我确信我们不需要通过 Blazor 服务器客户端完成 API,因为它可以通过依赖注入访问 Mediatr。我觉得通过 API 将 C# 对象反序列化为 JSON 只是为了在之后再次序列化它是愚蠢的。

这是对 API 的请求:

[HttpPost("organizr-user")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<OrganizrUserResponse>> CreateOrganizrUser([FromBody] CreateOrganizrUserCommand command)
{
    var result = await _mediator.Send(command);
    return Ok(result);
}

这是 Blazor 服务器上的请求:

private async Task OnButtonSave_Clicked()
{
    _userCreated = false;
    _showErrors = false;
       
    var query = new RegisterUserRequest
    {
        FirstName = _firstName,
        LastName = _lastName,
        Gender = (Gender)_gender,
        Address = _address,
        PhoneNumber = _phoneNumber,
        Email = _email,
        Password = _password,
        ConfigRefreshPrivilege = _refreshConfiguration
    };

    var result = await Mediator.Send(query);

    if (!result.Succeeded)
    {
        _showErrors = true;
        _errors = result.Errors.ToList();
    }
    else
    {
        _userCreated = true;
    }
}

我觉得(是的,有很多感觉)我们仍然坚持使用Mediatr的只有一个接入点的原则。 Blazor 不需要 API,但 Angular 需要。

解决这个问题的正确方法是什么?

很高兴您如此认真地对待这个学校项目。

与所有架构决策一样 - “视情况而定”。没有灵丹妙药,只有最适合你的情况。

我认为你们都有一些观点。你说你坚持单点访问是正确的,从而减少了你需要编写的代码量——但这不是这里唯一要考虑的事情。你需要再问自己几个问题。

您应该将其视为具有扩展潜力的生产应用程序

以下是您应该问自己的一些问题。

  1. API 和 Blazor Web 服务器是否将托管在与数据库相同的服务器上?
  2. API 应该是无状态的,您是否会在编写 Blazor Web 应用程序时考虑这一点,因为它们使用相同的代码?
  3. 您的应用程序可扩展吗?您将如何在 API 和 blazor Web 服务器上实现负载平衡之类的东西?
  4. 如果需要,我可以在整体设计中轻松 replace/change 一些吗?

如果我必须为你选择,我建议通过网络过滤所有内容API。

原因如下:

  • 关于托管,您有更多选择 - 您可以在一台服务器上托管 Blazor Web 应用程序,而在另一台服务器上托管 database/webAPI。
  • 将开发者逼入“成功的坑”。如果您有 10 名开发人员在开发该产品,他们更容易将应用程序视为“一个 API”,而不是“API 和使用相同代码的服务器”。这现在看起来可能并不重要,但请相信我,如果您不让事情尽可能简单,那么大型应用程序很快就会变得非常复杂。
  • 在 Blazor Web 服务器上创建负载平衡器可能很棘手,因为它使用 SignalR 与客户端通信。
  • 测试变得更容易。如果您的 Blazor 应用程序具有您的 Angular 客户端没有的功能怎么办?这意味着它永远不会被构建到网络中 api。现在您需要在两个独立的服务器上进行负载测试、压力测试等操作,而不仅仅是 Web API。如果一切 运行 通过 Web API.
  • ,则 Blazor Web 服务器所需的测试将大大缩减
  • 最后但同样重要的是,Blazor 开发人员以在 Blazor 客户端和 Blazor Web 服务器之间切换如此简单而自豪。如果将来您认为 Blazor Web 服务器不是最佳解决方案,而您更喜欢 Blazor 客户端怎么办?如果一切都是 运行 通过 Web API 这将是几行代码。如果没有 - 你有很多重构要做。

我认为现在通过 API 编写一些额外的行来“序列化和反序列化”是一个更好的主意,并且以后可以避免潜在的麻烦。

这是我根据个人经验得出的意见 - 保持简单、可读和可扩展。

希望对您有所帮助。

如果你想让我澄清任何事情,请告诉我。

编码愉快!!