私は最近、一見些細な建築上の問題に直面しました。私のコードには、次のように呼ばれるシンプルなリポジトリがありました(コードは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は、関数でのログ記録またはイベントの使用を禁止していません。そのようなロジックは他のクラスにカプセル化する必要があると述べているだけで、リポジトリがこれらの他のクラスを呼び出すことは問題ありません。