我目前正在和一个同学一起做一个学校项目。我们决定制作管理客户端 (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 的使用达成共识。
- 我的同学确信 Blazor Server 客户端和 Angular 客户端都应该通过 REST API。
- 我确信我们不需要通过 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 之类的东西,只有最适合您的情况。
我认为你们都有一些观点。你说你坚持单点访问是正确的,从而减少了你需要编写的代码量——但这不是这里唯一要考虑的事情。你需要再问自己几个问题。
您应该将其视为具有扩展潜力的生产应用程序
以下是您应该问自己的一些问题。
- API 和 Blazor 网络服务器是否将托管在与数据库相同的服务器上?
- API 应该是无状态的,您是否会在编写 blazor 网络应用程序时考虑到这一点,因为它们使用相同的代码?
- 您的应用程序可扩展吗?您将如何在 API 和 Blazor Web 服务器上实现负载平衡等功能?
- 如果需要,我能否轻松替换/更改整体设计中的一些内容?
如果我必须为您选择,我会建议通过 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/