方法使用存储库模式(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的内存分配)

传递新插入的唯一Id的"最干净"的方式是什么?

还是上面的代码片段合适?

如果解释不充分,请向我道歉。

认为,

在某些方面,是的。代码有异味。为什么,因为这里你引入了Bio和Token引用的硬耦合。

如果将来您想要更新Token在应用程序中创建的方式该怎么办?您必须返回并更新用户存储库的Add()方法,这没有意义。作为一种良好的实践,类中的任何更改都应该对其他类产生最小的影响。遵循构建松散耦合系统的实践。

在这里,提供添加用户所需的令牌id和创建Bio所需的用户id的责任可以转移给调用者,而不是AddUser()。即控制反转。

要最小化耦合,您可以执行如下操作;

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

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

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

最新更新