在使用存储库模式时,我应该将我的存储库方法放多少逻辑?

Cha*_*ear 9 c# nhibernate domain-driven-design repository repository-pattern

我正在与存储库进行一些努力.我正在使用C#和NHibernate.我的问题是:我的存储库在调用save或get之前应该做多少?

例如,我有一个用户类,它是一个聚合根.我想调用一个名为"register"的方法,它将添加用户并根据业务规则设置一些默认值,并创建一些其他实体,这些实体也是"用户"根的子部分(即地址,组等).我应该打电话吗?

userRepo.Register(newUser); 
Run Code Online (Sandbox Code Playgroud)

这将是(忽略明显的问题):

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);
}
Run Code Online (Sandbox Code Playgroud)

或者我应该将注册放在业务层中并让它做:

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.
}
Run Code Online (Sandbox Code Playgroud)

两者似乎都有些错误.

什么是正确的方法?

编辑-------------------------------

感谢所有的回复.我不能决定谁是最合适的,因此接受哪个答案.

通常每个人都在说将业务规则放在另一层.这是有道理的,但我不确定组的数据调用 - 因为组不是聚合根,他们不应该有自己的存储库,所以我如何添加和保存它们?在我的项目中,将一个组添加到用户的组集合中不会自动在数据库中创建该组; 我还需要在对象上调用session.save.所以我把它作为userRepo.SaveGroup(g)放入用户仓库?

如果我在另一个层中有一个createGroup(),那么它将需要使用它自己的repo或用户.还是我很厚?

Jar*_*yer 6

就个人而言,我将存储库模式保留为sprocs的替代品.所以,我的仓库将有类似的方法getById(int id),save(),add(DomainObject obj)等.

在业务层中,我有userManager.registerUser(字符串用户名,/*params等*/).这将创建域对象.此方法只会调用add()数据层中的方法.

简而言之,业务层是业务层,数据层是数据层.


Kev*_*ber 2

确定您想要 Register 方法的位置,也许在 UserServices 类中。您可以将对象创建委托给 UserFactory。在 CreateNewUser() 方法中,设置用户和 Groups 集合的默认值。然后调用UserRepository.Save(newUser)来持久化数据。

// UserServices class
public void Register(User newUser)
{
  // add custom registration stuff.
  _userRepository.Save(newUser);
}

// Application code
User user = UserFactory.CreateNewUser();
_userServices.Register(user);

// UserFactory
public User CreateNewUser()
{
  // all new user, group creation
}
Run Code Online (Sandbox Code Playgroud)