我认为我有一个业余建筑问题,但这是我很长时间以来一直在努力解决的问题。
我有一个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?
答案 0 :(得分:0)
一种可能的解决方案是从_userRepository.SaveChanges();
方法发送此通知。
您将检查UoW更改跟踪器,以了解所有处于“已创建”状态的用户实体,并在提交后发送这些通知。
但是,使用这种方法,通知发送将隐藏在您的基础结构/数据访问/ ...层中。这意味着通知发送逻辑将不属于您的域/核心逻辑。为了使某人意识到逻辑的这一部分,他们将不得不深入研究存储库(或UoW)的实现细节。
相反,您可以从_userRepository.SaveChanges();
触发一个事件,并按照您的核心逻辑订阅该事件。
我将采用以下方法:
_userRepository.SaveChanges();
中为每个创建的用户触发一个UserCreatedEvent
事件,其中将包含有关该用户的信息。_notificationService.SendUserCreatedNotification(user);
。这样,您还可以将用户创建逻辑与通知发送逻辑分离。