使用存储库模式负责的方法(C#)

时间:2015-07-10 20:01:41

标签: c#

所以我刚刚开始介绍了存储库模式的基础知识,我似乎在为“什么在哪里”而苦苦挣扎。

我有一个从创建帐户页面插入用户的方法。

前端:

using (UserRepository userRepo = new UserRepository()) 
{
  userRepo.Add(some params here);
}

后端:

/// <summary>
/// Inserts a new user to the db
/// </summary>
/// <param name="encryptedPassword">Encrypted Password</param>
/// <param name="email">Plain text email</param>
/// <param name="tokenId">Security Token ID</param>
/// <param name="encryptedEmail">Encrypted Password</param>
public void Add(string encryptedPassword, string email, string encryptedEmail, string firstName, string surName)
{
   //try { }
   //catch { }

   //Create Token
   string guid = System.Guid.NewGuid().ToString();
   tbl_Token newToken = new tbl_Token();
   newToken.DateAdded = DateTime.Now;
   newToken.Name = guid;
   _context.tbl_Token.Add(newToken);

   //Create User
   tbl_User createUser = new tbl_User();
   createUser.DateAdded = DateTime.Now;
   createUser.IsAccountConfirmed = false;
   createUser.Email = email;
   createUser.EncryptedEmail = encryptedEmail;
   createUser.EncryptedPassword = encryptedPassword;
   createUser.TokenId = newToken.TokenId;
   _context.tbl_User.Add(createUser);

   //Create Bio
   tbl_Bio newBio = new tbl_Bio();
   newBio.UserId = createUser.UserId;
   newBio.FirstName = firstName;
   newBio.LastName = surName;
   newBio.ProfilePic = "avatar.png";
   newBio.DateAdded = DateTime.Now;
   _context.tbl_Bio.Add(newBio);

}

当我制作这个时,我立即知道有一种代码味道,这种方法包含很多责任。在用户单击按钮的操作上,它应该创建一个令牌,然后创建一个访问TokenId的用户,然后创建一个访问UserId的Bio。所以这都是关系。

UserRepo是否应该依赖TokenRepo和BioRepo? (说过新的DB上下文,它会丢失每个新的repo实例的Id的内存分配)

传递新插入的唯一身份证的“最干净”方式是什么?

或者上面的代码片段是否合适?

如果缺乏解释,请道歉。

此致

2 个答案:

答案 0 :(得分:0)

Instinct说所有这些的创建应该是分开的,然后在事务中包含在某种服务层中。服务层将更新/插入所需的任何内容,并且需要访问所涉及的每个存储库。

答案 1 :(得分:0)

在某些方面,是的。代码闻起来。为什么,因为在这里你引入了Bio和Token参考文献的硬耦合。

如果您将来要更新在应用程序中创建令牌的方式,该怎么办?您必须返回并更新用户存储库的Add()方法,这是没有意义的。作为一种好的做法,类中的任何更改都应该对其他类的影响最小。按照惯例建立一个松散耦合的系统。

此处,提供创建Bio所需的添加用户和用户ID所需的令牌ID的责任可以转移到呼叫者而不是AddUser()。即控制反转。

为了尽量减少耦合,您可以执行以下操作;

假设调用者是一个方法Registeration():

public void Registeration()
{
  // Create Token
  var TokenId = tokenRepo.Add();
  // Create user
  var UserId = userRepo.Add(TokenId, /*....params ... */);
  // Now add Bio
  var Bio = userBioRepo.Add(UserId, /*....params ... */);
}

让Add方法只添加用户并摆脱Bio和Token的创建。