LINQ-to-SQL存储库模式尝试正在运行,但我关心的是分离

时间:2011-08-02 02:00:33

标签: sql asp.net-mvc linq

我是LINQ to SQL和存储库模式的新手,并且正在尝试做一个简单的示例来了解我的应用程序应该如何构建。在我的User模型对象上,我有一个名为create()的方法。创建用户时,我想插入到我的User表中并插入到我的user_role表中,为用户分配尽可能低的角色。我在User模型上有一个名为create的方法,可以完成所有这些工作。如下所示。我是否正确使用LINQ to SQL的存储库模式如何工作。

    public Boolean Create()
    {            
        UserDbDataContext context = new UserDbDataContext();

        // Create user.
        IUserRepository userRepo = new UserRepository(context);            
        userRepo.Create(this);

        // Get role that user should be added to.
        IRoleRepository roleRepo = new RoleRepository(context);
        var role = roleRepo.GetByRoleName("rookie");

        // Insert user into role.
        IUserRoleRepository userRoleRepo = new UserRoleRepository(context);
        User_Role userRole = new User_Role();
        userRole.RoleId = role.Id;
        userRole.UserId = this.Id;
        userRoleRepo.Create(userRole);

        context.Dispose();

        return true;
    }

这是我的控制器方法。

    public ActionResult Register(string username, string password, string email)
    {
        User user = new User();
        user.Username = username;
        user.Password = password;
        user.Email = email;
        user.DateCreated = DateTime.Now;
        user.Create();

        return RedirectToAction("Test");
    }

我可以采取更好的方法来改进流程吗?任何帮助将非常感激。

2 个答案:

答案 0 :(得分:2)

当前方法的一个主要问题是存储库单独负责创建/更新它们在数据库上保存的实体 - 这意味着如果您在一个存储库中进行了更改并更新了另一个存储库(即您的{ {1}}调用)两者都将被提交给DB。

通常的结构方法是使unit of work(即参见here)位于负责提交更改数据库的所有存储库之上,此结构还允许跨越事务多个存储库。

答案 1 :(得分:1)

我想说你应该让存储库负责保存和检索实体的数据。 “角色”在“业务逻辑”方面更多一些,我会在服务中添加一层,这样您就不会在存储库中执行任何业务逻辑职责。例如,您可以将其称为CreateNewUserService,它将从存储库中获取新用户,然后添加角色。您可以直接从控制器调用它,直接传递您正在直接应用的参数。

这样,如果您的业务逻辑发生了变化,以至于您希望将用户初始化为其他内容,或者根本不需要,则不必破坏存储库,因为它可以使其负责提供用户。这样可以使关注点的分离更加清晰,并有助于维护和测试存储库和服务。