封装创建逻辑的最佳方式
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);
但是:
- 此服务的目的在逻辑上很奇怪(将用户添加到
回购,保存对回购的更改,发送通知);我想不出来
此服务和方法的好名字
- 服务方法只有 3 行代码:Add/Save/SendUserCreatedNotification
你平时是怎么解决这类任务的?方法 2 是最好的方法吗?或者也许存在更好的方法 3?
一种可能的解决方案是从 _userRepository.SaveChanges();
方法发送此通知。
您将检查所有处于 'Created' 状态的用户实体的 UoW 更改跟踪器,并在提交后发送这些通知。
但是,使用这种方法,通知发送将隐藏在您的 infrastructure/data access/... 层中。这意味着通知发送逻辑不会成为您的 domain/core 逻辑的一部分。要让某人了解这部分逻辑,他们必须深入研究您的存储库(或 UoW)的实现细节。
相反,您可以 从 _userRepository.SaveChanges();
触发一个事件 并在您的核心逻辑中订阅该事件。
我将采用的方法如下:
- 在
_userRepository.SaveChanges();
中,为每个创建的用户触发一个 UserCreatedEvent
事件,其中将包含有关用户的信息。
- 在您的核心逻辑中订阅该事件并从事件处理程序中调用
_notificationService.SendUserCreatedNotification(user);
。
这样,您还可以将用户创建逻辑与通知发送逻辑分离。
我想我有一个业余架构问题,但这是我很长一段时间以来一直在努力弄清楚的问题。
我有一个 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);
但是:
- 此服务的目的在逻辑上很奇怪(将用户添加到 回购,保存对回购的更改,发送通知);我想不出来 此服务和方法的好名字
- 服务方法只有 3 行代码:Add/Save/SendUserCreatedNotification
你平时是怎么解决这类任务的?方法 2 是最好的方法吗?或者也许存在更好的方法 3?
一种可能的解决方案是从 _userRepository.SaveChanges();
方法发送此通知。
您将检查所有处于 'Created' 状态的用户实体的 UoW 更改跟踪器,并在提交后发送这些通知。
但是,使用这种方法,通知发送将隐藏在您的 infrastructure/data access/... 层中。这意味着通知发送逻辑不会成为您的 domain/core 逻辑的一部分。要让某人了解这部分逻辑,他们必须深入研究您的存储库(或 UoW)的实现细节。
相反,您可以 从 _userRepository.SaveChanges();
触发一个事件 并在您的核心逻辑中订阅该事件。
我将采用的方法如下:
- 在
_userRepository.SaveChanges();
中,为每个创建的用户触发一个UserCreatedEvent
事件,其中将包含有关用户的信息。 - 在您的核心逻辑中订阅该事件并从事件处理程序中调用
_notificationService.SendUserCreatedNotification(user);
。
这样,您还可以将用户创建逻辑与通知发送逻辑分离。