所以我刚刚开始介绍了存储库模式的基础知识,我似乎在为“什么在哪里”而苦苦挣扎。
我有一个从创建帐户页面插入用户的方法。
前端:
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的内存分配)
传递新插入的唯一身份证的“最干净”方式是什么?
或者上面的代码片段是否合适?
如果缺乏解释,请道歉。
此致
答案 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的创建。