具有 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.
的使用达成协议。
- 我的同学确信 Blazor Server 客户端和 Angular 客户端都应该通过 REST API。
- 我确信我们不需要通过 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 需要。
解决这个问题的正确方法是什么?
很高兴您如此认真地对待这个学校项目。
与所有架构决策一样 - “视情况而定”。没有灵丹妙药,只有最适合你的情况。
我认为你们都有一些观点。你说你坚持单点访问是正确的,从而减少了你需要编写的代码量——但这不是这里唯一要考虑的事情。你需要再问自己几个问题。
您应该将其视为具有扩展潜力的生产应用程序
以下是您应该问自己的一些问题。
- API 和 Blazor Web 服务器是否将托管在与数据库相同的服务器上?
- API 应该是无状态的,您是否会在编写 Blazor Web 应用程序时考虑这一点,因为它们使用相同的代码?
- 您的应用程序可扩展吗?您将如何在 API 和 blazor Web 服务器上实现负载平衡之类的东西?
- 如果需要,我可以在整体设计中轻松 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 编写一些额外的行来“序列化和反序列化”是一个更好的主意,并且以后可以避免潜在的麻烦。
这是我根据个人经验得出的意见 - 保持简单、可读和可扩展。
希望对您有所帮助。
如果你想让我澄清任何事情,请告诉我。
编码愉快!!
我目前正在和一个同学一起做一个学校项目。我们决定对管理客户端 (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.
的使用达成协议。- 我的同学确信 Blazor Server 客户端和 Angular 客户端都应该通过 REST API。
- 我确信我们不需要通过 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 需要。
解决这个问题的正确方法是什么?
很高兴您如此认真地对待这个学校项目。
与所有架构决策一样 - “视情况而定”。没有灵丹妙药,只有最适合你的情况。
我认为你们都有一些观点。你说你坚持单点访问是正确的,从而减少了你需要编写的代码量——但这不是这里唯一要考虑的事情。你需要再问自己几个问题。
您应该将其视为具有扩展潜力的生产应用程序
以下是您应该问自己的一些问题。
- API 和 Blazor Web 服务器是否将托管在与数据库相同的服务器上?
- API 应该是无状态的,您是否会在编写 Blazor Web 应用程序时考虑这一点,因为它们使用相同的代码?
- 您的应用程序可扩展吗?您将如何在 API 和 blazor Web 服务器上实现负载平衡之类的东西?
- 如果需要,我可以在整体设计中轻松 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 编写一些额外的行来“序列化和反序列化”是一个更好的主意,并且以后可以避免潜在的麻烦。
这是我根据个人经验得出的意见 - 保持简单、可读和可扩展。
希望对您有所帮助。
如果你想让我澄清任何事情,请告诉我。
编码愉快!!