繁体   English   中英

封装创建逻辑的最佳方法

[英]Best way to encapsulate creation logic

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

我有一个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?

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

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

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

我将采用以下方法:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM