【问题标题】:LINQ-to-SQL repository pattern attempt that is working, but am concerned with seperationLINQ-to-SQL 存储库模式尝试有效,但我担心分离
【发布时间】:2011-08-02 02:00:33
【问题描述】:

我是 LINQ to SQL 和存储库模式的新手,我试图通过一个简单的示例来了解我的应用程序应该如何构建。在我的用户模型对象上,我有一个名为 create() 的方法。创建用户时,我想插入到我的用户表中并插入到我的 user_role 表中,为用户分配尽可能低的角色。我在用户模型上有一个名为 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");
    }

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

【问题讨论】:

    标签: sql asp.net-mvc linq


    【解决方案1】:

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

    通常的结构方式是在负责向数据库提交更改的所有存储库之上使用unit of work(即参见here),这种结构还允许跨多个存储库的事务。

    【讨论】:

      【解决方案2】:

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

      这样,如果您的业务逻辑发生变化,因此您希望将用户初始化为其他东西或根本不初始化,您不必破坏存储库,因为它可以保持提供用户的责任。这也使关注点的分离更加清晰,并有助于存储库和服务的维护和可测试性。

      【讨论】:

        猜你喜欢
        • 2010-12-12
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2010-09-23
        • 2010-10-25
        相关资源
        最近更新 更多