[英]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);
但:
您通常如何解决此类任务? 方法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.