我在存储库方面有点挣扎。我正在使用 C# 和 NHibernate。我的问题是:我的存储库在调用保存或获取之前应该做多少?
例如,我有一个用户类,它是一个聚合根。我想调用一个名为“register”的方法,它将添加用户并根据业务规则设置一些默认值,并创建一些其他实体,这些实体也是“用户”根目录的子部分(即地址、组等)。我应该打电话吗
userRepo.Register(newUser);
这将是(忽略明显的问题):
Regsiter(User newUser){
newUser.SomeProp = "Default Data";
Group g= new Group;
g.SomeProp2 = "Default Data";
newUser.Groups.Add(g);
Session.Save(g);
Session.Save(newUser);
}
或者我应该把注册放在业务层并让它这样做:
Regsiter(User newUser){
newUser.SomeProp = "Default Data";
Group g= new Group;
g.SomeProp2 = "Default Data";
newUser.Groups.Add(g);
userRepo.Register(newUser, g);// this does session.save on both objects.
}
两者似乎都有些错误。
什么是正确的方法?
编辑 - - - - - - - - - - - - - - - -
感谢所有的回复。我无法决定谁是最正确的,因此无法决定接受哪个答案。
通常每个人都在说将业务规则放在另一层。这是有道理的,但我不确定组的数据调用 - 因为组不是聚合根,所以它们不应该有自己的存储库,所以我该如何添加和保存它们?在我的项目中,将组添加到用户的组集合不会自动在数据库中创建组;我还需要在对象上调用 session.save。那么我是否将其作为 userRepo.SaveGroup(g) 放入用户存储库中?
如果我在另一层有一个 createGroup() 那么它要么需要使用它自己的 repo 要么使用用户。还是我很厚?