封装创建逻辑的最佳方式

Best way to encapsulate creation logic

我想我有一个业余架构问题,但这是我很长一段时间以来一直在努力弄清楚的问题。

我有一个 C# web 项目,它在多个地方创建用户,如下所示:

var user = /*create user somehow*/;
_userRepository.Add(user);
_userRepository.SaveChanges();

现在我需要添加在每次创建用户时发送电子邮件通知的逻辑:

var user = /*create user somehow*/;
_userRepository.Add(user);
_userRepository.SaveChanges();
_notificationService.SendUserCreatedNotification(user);

问题是我不想在所有创建新用户的地方添加相同的代码行(干!)。

现在,我可以将 Add/Save/SendUserCreatedNotification 逻辑包装在一个单独的服务中:

var user = /*create user somehow*/;
_userCreationService.AddAndSave(user);

但是:

你平时是怎么解决这类任务的?方法 2 是最好的方法吗?或者也许存在更好的方法 3?

一种可能的解决方案是从 _userRepository.SaveChanges(); 方法发送此通知。 您将检查所有处于 'Created' 状态的用户实体的 UoW 更改跟踪器,并在提交后发送这些通知。

但是,使用这种方法,通知发送将隐藏在您的 infrastructure/data access/... 层中。这意味着通知发送逻辑不会成为您的 domain/core 逻辑的一部分。要让某人了解这部分逻辑,他们必须深入研究您的存储库(或 UoW)的实现细节。

相反,您可以 _userRepository.SaveChanges(); 触发一个事件 并在您的核心逻辑中订阅该事件。

我将采用的方法如下:

  • _userRepository.SaveChanges(); 中,为每个创建的用户触发一个 UserCreatedEvent 事件,其中将包含有关用户的信息。
  • 在您的核心逻辑中订阅该事件并从事件处理程序中调用 _notificationService.SendUserCreatedNotification(user);

这样,您还可以将用户创建逻辑与通知发送逻辑分离。