所以我们刚刚开始学习存储库模式的基础知识,我似乎在纠结"什么放到哪里"。
我有一个从创建帐户页面插入用户的方法。
前端:
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表示,所有这些的创建应该是分开的,然后在事务中的某种服务层中包装起来。服务层将更新/插入所需的任何内容,并且需要访问所涉及的每个存储库。