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或用户.还是我很厚?
就个人而言,我将存储库模式保留为sprocs的替代品.所以,我的仓库将有类似的方法getById(int id),save(),add(DomainObject obj)等.
在业务层中,我有userManager.registerUser(字符串用户名,/*params等*/).这将创建域对象.此方法只会调用add()数据层中的方法.
简而言之,业务层是业务层,数据层是数据层.
确定您想要 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)
| 归档时间: |
|
| 查看次数: |
2219 次 |
| 最近记录: |