我是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");
}
我可以采取更好的方法来改进流程吗?任何帮助将非常感激。
答案 0 :(得分:2)
当前方法的一个主要问题是存储库单独负责创建/更新它们在数据库上保存的实体 - 这意味着如果您在一个存储库中进行了更改并更新了另一个存储库(即您的{ {1}}调用)两者都将被提交给DB。
通常的结构方法是使unit of work(即参见here)位于负责提交更改数据库的所有存储库之上,此结构还允许跨越事务多个存储库。
答案 1 :(得分:1)
我想说你应该让存储库负责保存和检索实体的数据。 “角色”在“业务逻辑”方面更多一些,我会在服务中添加一层,这样您就不会在存储库中执行任何业务逻辑职责。例如,您可以将其称为CreateNewUserService,它将从存储库中获取新用户,然后添加角色。您可以直接从控制器调用它,直接传递您正在直接应用的参数。
这样,如果您的业务逻辑发生了变化,以至于您希望将用户初始化为其他内容,或者根本不需要,则不必破坏存储库,因为它可以使其负责提供用户。这样可以使关注点的分离更加清晰,并有助于维护和测试存储库和服务。