我很困惑我应该在哪里实现描述实体关系的逻辑。 例如,我有2个参与者:用户和具有多对多关系的角色。
用户存储库代码如下所示:
public override void Insert(User user)
{
foreach (Group group in user.Groups)
{
List<Group> groups = new List<Group>();
foreach(decimal id in user.Groups.Select(g => g.Id))
{
Group g = _context.Groups.Find(id);
groups.Add(g);
}
user.Groups = groups;
}
_context.Users.Insert(user);
}
可能是存储库shuoldn关注关系?
或它应该在商业服务中:
private GroupRepository _groupRepository;
private UserRepository _userRepositpry;
public override void Insert(User user)
{
foreach (Group group in user.Groups)
{
// ...
foreach(decimal id in user.Groups.Select(g => g.Id))
{
Group g = _groupRepository.Get(id)
user.Add(g);
}
}
_userRepository.Insert(user);
}
答案 0 :(得分:1)
我认为使用存储库模式的第一种方法是最好的,因为我认为存储库模式非常适合MVC。所以我认为第一种方法是最好的,使用存储库模式(使用Web的MVC / MVVM模式或winforms的MVP模式)。
我喜欢将存储库保存为可以直接进行数据库调用的数据访问层,也可以将其连接到实体框架中。
使用存储库模式和上面的代码,最好在存储库中拥有更多方法,以防将来重用 - 例如一个用于获取组,一个用于插入等,然后在控制器中调用这些单独的存储库方法。
以下示例代码仅用于指示模式:
控制器类GroupController.cs
private GroupRepository groupRepository = new GroupRepository();
private UserRepository userRepository = new UserRepository();
// entry point to controller class
public ActionResult Group()
{
// Make call to repository to get group
Group group = GetGroupsForUser(user);
// Make call to repository to insert user
InsertUser();
}
private Group GetGroupsForUser(User user)
{
List<Group> groups = new List<Group>();
// Call to get user details - for demo purposes
foreach (IdentityReference domainGroup in WindowsIdentity.GetCurrent().Groups)
{
IdentityReference group = domainGroup.Translate(typeof(NTAccount));
groups.Add(group);
}
}
private void InsertUser()
{
bool success = groupRepository.PopulateGroup(user)
}
存储库应主要用作数据库/实体框架调用的数据访问层,控制器应该影响填充到模型中的数据。