簡體   English   中英

如何將這些代碼從使用EF db上下文更新為通用存儲庫?

[英]How to update this code from using the EF db context to a generic repository?

在使用MembershipProvider重新創建用戶時,我發現一些新代碼並未使用以下代碼創建:

// the call
Membership.CreateUser(user.Username, user.Password, user.EmailAddress, null, null, false, null, out createStatus);


    public override MembershipUser CreateUser(string username,
       string password, string email, string passwordQuestion,
       string passwordAnswer, bool isApproved,
       object providerUserKey, out MembershipCreateStatus status)
    {

        using (var db = new DbV001Context())
        {
            var crypto = new SimpleCrypto.PBKDF2();
            var encryptedPw = crypto.Compute(password);
            var user = db.Users.Create();

            user.MembershipTypeId = 7; 
            user.UserName = username;
            user.Email = email;
            user.Password = encryptedPw;
            user.PasswordSalt = crypto.Salt;
            //user.CreateDate = DateTime.Now; // set automatically in the db

            //user.CreateDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastLoginDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastActivityDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastPasswordChangedDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastLockoutDate = new DateTime(1980, 01, 01, 0, 0, 0, 0);

            db.Users.Add(user);
            try
            {
                db.SaveChanges();
            } ...

我在實現存儲庫和UoW模式之前編寫了這部分代碼,在其他地方都使用了它:

    private readonly IUnitOfWork _unitOfWork;
    private readonly IRepository<User> _repository;

    public AccountController() { }

    public AccountController(IUnitOfWork unitOfWorkAsync,
        IRepository<User> repository)
    {
        _unitOfWork = unitOfWorkAsync;
        _repository = repository;
    }

   .
   .
   .
                var userEntity = _repository
                    .ODataQueryable()
                    .Where(u => (u.Email == user.EmailAddress | u.UserName == user.Username)
                                && u.Email != null).ToList();

我嘗試了以下操作,但是在嘗試Insert()時總是遇到異常:

public class CustomMembershipProvider : MembershipProvider
{
    //private DbV001Context _db = new DbV001Context();
    private readonly IUnitOfWork _unitOfWork;
    private readonly IRepository<User> _repository;

    public CustomMembershipProvider() { }

    public CustomMembershipProvider(IUnitOfWork unitOfWorkAsync,
        IRepository<User> repository)
    {
        _unitOfWork = unitOfWorkAsync;
        _repository = repository;
    }
    public override MembershipUser CreateUser(string username,
       string password, string email, string passwordQuestion,
       string passwordAnswer, bool isApproved,
       object providerUserKey, out MembershipCreateStatus status)
    {

        //using (var db = new DbContext())
        //{
            var crypto = new SimpleCrypto.PBKDF2();
            var encryptedPw = crypto.Compute(password);
            //var user = db.Users.Create();
            var user = new User();

            user.MembershipTypeId = 7; 
            user.UserName = username;
            user.Email = email;
            user.Password = encryptedPw;
            user.PasswordSalt = crypto.Salt;
            //user.CreateDate = DateTime.Now; // set automatically in the db

            //user.CreateDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastLoginDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastActivityDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastPasswordChangedDate = new DateTime(1980,01,01,0,0,0,0);
            user.LastLockoutDate = new DateTime(1980, 01, 01, 0, 0, 0, 0);


            //db.Users.Add(user);
            try
            {
                //db.SaveChanges();
                _repository.InsertGraph(user);  //Object reference not set to an instance of an object.
            }

既然我已經看了一段時間了,那么如何更新上面的代碼以使用存儲庫而不是db上下文呢? 另外,由於我使用的是DI,設置CustomMembershipProvider什么嗎?

當我單步執行代碼時,沒有執行CustomMembershipProvider構造函數。 使用Autofac進行DI。

我不認為成員資格提供程序允許您在構造函數中提供參數...在不帶參數的構造函數中,您可以將當前實例分配給UOW和存儲庫,如果尚未完成,則可以激活它們。

但這取決於您使用的DI框架。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM