封装创建逻辑的最佳方法

时间:2019-03-18 16:20:51

标签: c# architecture repository

我认为我有一个业余建筑问题,但这是我很长时间以来一直在努力解决的问题。

我有一个C#网络项目,可以在多个地方创建用户,例如:

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

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

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

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

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

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

但是:

  • 此服务的目的在逻辑上很奇怪(将用户添加到 回购,保存对回购的更改,发送通知);我什至不认为 此服务和方法的好名字
  • 服务方法只有三行代码:Add / Save / SendUserCreatedNotification

您通常如何解决此类任务?方法2是最好的方法吗?还是存在更好的方法3?

1 个答案:

答案 0 :(得分:0)

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

但是,使用这种方法,通知发送将隐藏在您的基础结构/数据访问/ ...层中。这意味着通知发送逻辑将不属于您的域/核心逻辑。为了使某人意识到逻辑的这一部分,他们将不得不深入研究存储库(或UoW)的实现细节。

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

我将采用以下方法:

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

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