我最近遇到了一个看似微不足道的建筑问题。我的代码中有一个简单的存储库,其名称如下所示(代码在C#中):
var user = /* create user somehow */;
_userRepository.Add(user);
/* do some other stuff*/
_userRepository.SaveChanges();
SaveChanges
是一个简单的包装程序,用于将更改提交到数据库:
void SaveChanges()
{
_dataContext.SaveChanges();
_logger.Log("User DB updated: " + someImportantInfo);
}
然后,过了一段时间,我需要实现新的逻辑,该逻辑每次在系统中创建用户时都会发送电子邮件通知。由于有许多来电_userRepository.Add()
和SaveChanges
系统的时候,我决定更新SaveChanges
如下:
void SaveChanges()
{
_dataContext.SaveChanges();
_logger.Log("User DB updated: " + someImportantInfo);
foreach (var newUser in dataContext.GetAddedUsers())
{
_eventService.RaiseEvent(new UserCreatedEvent(newUser ))
}
}
这样,外部代码可以订阅UserCreatedEvent并处理将发送通知的所需业务逻辑。
但有人向我指出,我对的修改SaveChanges
违反了“单一责任”原则,SaveChanges
应该保存而不触发任何事件。
这是有效的观点吗?在我看来,在此处引发事件与日志记录本质上是相同的:只是向该函数添加一些辅助功能。SRP并没有禁止您在函数中使用日志或激发事件,它只是说这种逻辑应该封装在其他类中,并且存储库可以调用这些其他类。