业务层或持久层(存储库)中的实体关系逻辑

时间:2014-11-09 20:53:36

标签: .net entity-framework design-patterns

我很困惑我应该在哪里实现描述实体关系的逻辑。 例如,我有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);
}

1 个答案:

答案 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)
}

存储库应主要用作数据库/实体框架调用的数据访问层,控制器应该影响填充到模型中的数据。