c# - 具有 2 个前端应用程序(Blazor Server 和 Angular)的项目的建议架构,包括 EFCore、Identity、Mediatr

标签 c# angular entity-framework-core asp.net-identity blazor-server-side

我目前正在和一个同学一起做一个学校项目。我们决定制作管理客户端 (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 Server 都可以通过 Mediatr 访问该数据库。

不幸的是,我们无法就应如何处理 API 的使用达成共识。

  1. 我的同学确信 Blazor Server 客户端和 Angular 客户端都应该通过 REST API。
  2. 我确信我们不需要通过 Blazor 服务器客户端的 API,因为它可以通过依赖注入(inject)访问 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 需要。

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

最佳答案

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

与所有架构决策一样 - “视情况而定”。没有 Elixir 之类的东西,只有最适合您的情况。

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

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

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

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

如果我必须为您选择,我会建议通过 Web API 过滤所有内容。

原因如下:

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

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

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

希望对您有所帮助。

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

编码愉快!!

关于c# - 具有 2 个前端应用程序(Blazor Server 和 Angular)的项目的建议架构,包括 EFCore、Identity、Mediatr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72083710/

相关文章:

c# - 获取类所需的属性

c# - 表达式树中的绑定(bind)参数

c# - 当页面实际存在时,您什么时候会得到 404?

html - 表格中子行的滑动动画

sqlite - EF7 与 SQLite

C# Entity Framework Core - LINQ 检查一个数组在另一个数组中是否存在

c# - 委托(delegate)如何接收它的参数?

C# - 事件设计注意事项

angular - 将 Typescript "Map"作为 Angular4 HTTP POST 请求的一部分传递

javascript - 将 CSS 应用于事件路由器链接 [Angular 2]