我正在学习洋葱架构,目前正在开发遵循此架构的后端服务。我想在我的应用程序中包含的功能之一是每当某些用户收到新消息时向他们发送电子邮件。
应用层应该定义业务逻辑、验证逻辑,本质上是用例。 基础设施层提供存储库的实现,本质上是与外部系统的交互。电子邮件通知符合基础设施层描述。所以我的猜测是我必须在基础设施层内创建EmailNotificationService,然后在表示层内使用此服务。在当前应用程序中,我的表示层是由 .NET Core Web 应用程序中的 REST api 端点定义的。
因此,例如在我的表示层内部,我将在我的控制器之一中执行以下操作:
[HttpPost]
public async Task<IActionResult> SendMessage(Message message)
{
var result = await UserService.SendMessage(message);
await EmailService.Send(message);
return Results.Ok(result);
}
这种方法是否遵循简洁的架构?或者我应该将电子邮件通知放在另一层(例如应用程序层)
基础设施层提供存储库的实现
我认为你在这里的重点是错误的,应该放在实现上。
您应该将
EmailNotificationService
定义为域级别的接口(从名称上看,它听起来足够具体,不包含应用程序级别逻辑,因此域似乎是一个更好的选择),然后在基础设施上实现它(并且可以说使用DI原则提供给对应消费者实现)
我必须在基础设施层内创建 EmailNotificationService,然后在表示层内使用此服务 因此,例如在我的表示层内部,我将在我的一个控制器中执行以下操作
看起来您正在表示层中创建一个用例(在没有看到实际实现的情况下有点难以判断)。如果
UserService
决定是否应该发送推送通知而不是电子邮件,或者由于某些业务规则根本不应该发送任何消息怎么办?