如何实现包含新IdentityUser的工作单元

时间:2013-10-24 16:10:06

标签: c# asp.net-mvc-5 entity-framework-6

我想知道将UserManager添加到我的工作单元的最佳方法是什么。我应该使用IUstrore接口并在我的控制器中添加新的UserManager吗?我应该在UnitOfWork中使用UserManager还是应该做些不同的事情?

这是我的工作单元和控制器实现的两个想法。

public class UnitOfWorkPds : IUnitOfWorkPds, IDisposable
{
    private ApplicationDbContext context = new ApplicationDbContext();
    private IUserStore<ApplicationUser> userStore;

    public IUserStore<ApplicationUser> UserStore
    {
        get
        {
            if (this.userStore == null)
            {
                this.userStore = new UserStore<ApplicationUser>(context);
            }

            return userStore;
        }
    }
}

//interface
public interface IUnitOfWorkPds
{
    void Save();
    void Dispose();

    IUserStore<ApplicationUser> UserStore { get; }
}

控制器:

 var Umanager = new UserManager<ApplicationUser>(unitOfWorkPds.UserStore);
 Umanager.Dispose();

选项2在工作单元中创建用户管理器。

public class UnitOfWorkPds : IUnitOfWorkPds, IDisposable
{
    private ApplicationDbContext context = new ApplicationDbContext();
    private UserManager<ApplicationUser> userManager;

    public UserManager<ApplicationUser> UserManager
    {
        get
        {

            if (this.userManager == null)
            {
                this.userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
            }

            return userManager;
        }
    }
}

public interface IUnitOfWorkPds
{
   void Save();
   void Dispose();
   UserManager<ApplicationUser> UserManager { get; }
}

控制器:

 var UManager = unitOfWorkPds.UserManager
 Umanager.Dispose();

注意:我使用的是Asp.net MVC5,c#,Entity Framework 6.此外,我的工作单元中还有其他存储库,但我将它们留给了用户实现。

无论哪种方式起作用,我都会收到此警告,但要摆脱错误,我调用了this.userStore.Dispose();错误下面是我对Dispose的实现。目前我正在我的工作单元中调用userStore上的dispose。我还在我的控制器中为这个userStore创建了一个用户管理器,我也在我的控制器内的userManager上调用dispose。

  

CA2213一次性字段应该包含“UnitOfWorkPds”   字段'UnitOfWorkPds.userManager'是IDisposable类型:   '的UserManager'。更改Dispose方法   'UnitOfWorkPds'在此调用Dispose或Close   领域。 UnitOfWorkPds.cs 96

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                if(this.userStore != null)
                { this.userStore.Dispose(); }                  
                context.Dispose();

            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }

1 个答案:

答案 0 :(得分:0)

您需要查看UnitOfWork模式。 The Unit Of Work Pattern And Persistence Ignorance

对于错误问题,请确保您有以下代码段。

  • 错误指向从Dispose of UnitOfWorkPds类中调用Dispose。
  • 您正在调用userStroe,它应为userManager
  • 以下代码段缺少IUnitOfWorkPds
  • 的实现

public class UnitOfWorkPds : IUnitOfWorkPds, IDisposable
{
    private ApplicationDbContext context = new ApplicationDbContext();
    private UserManager<ApplicationUser> userManager;
    public UserManager<ApplicationUser> UserManager
    {
        get
        {

            if (this.userManager == null)
            {
                this.userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
            }
            return userManager;
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if(this.userManager != null)
            { this.userManager.Dispose(); }                  
            context.Dispose();
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
       GC.SuppressFinalize(this);
    }
    // Disposable types implement a finalizer.
    ~UnitOfWorkPds()
    {
        Dispose(false);
    }
}