Cómo implementar una Unidad de trabajo que contenga el nuevo IdentityUser

asp.net-mvc-5 c# entity-framework-6

Pregunta

Me pregunto cuál es la mejor manera de agregar UserManager a mi Unidad de trabajo. ¿Debo usar la interfaz IUstrore y agregar un nuevo UserManager en mi controlador? ¿Debo usar UserManager en mi UnitOfWork o debo hacer algo diferente?

Aquí hay dos ideas que tuve para mi unidad de trabajo y la implementación del controlador.

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; }
}

Controlador :

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; }
}

Opción 2 crear el usermanager en la unidad de trabajo.

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; }
}

Controlador :

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; }
}

Nota: Estoy utilizando Asp.net MVC5, c #, Entity Framework 6. También tengo otros repositorios en mi unidad de trabajo, pero los dejé para centrarme en la implementación del usuario.

De cualquier manera, al principio recibo esta advertencia, pero para deshacerme del error llamé this.userStore.Dispose (); Debajo del error está mi implementación de Dispose. Actualmente estoy llamando a disponer en el UserStore en mi Unidad de Trabajo. También creo un administrador de usuarios para este usuario Almacén en mi controlador y también estoy llamando a desechar en UserManager dentro de mi controlador.

CA2213 Los campos desechables deben eliminarse 'UnitOfWorkPds' contiene el campo 'UnitOfWorkPds.userManager' que es de tipo IDisponible: 'UserManager'. Cambie el método Dispose en 'UnitOfWorkPds' para llamar a Dispose o Close en este campo. UnitOfWorkPds.cs 96

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; }
}

Respuesta popular

Necesitas revisar el patrón de UnitOfWork. La unidad de trabajo patrón y persistencia ignorancia

Para el problema de error, asegúrese de tener los siguientes fragmentos de código.

  • El error apunta a llamar a Dispose desde dentro de la clase Dispose of UnitOfWorkPds.
  • Usted está llamando a userStroe, que será userManager
  • Faltan implementaciones siguientes de 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);
    }
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué