Как реализовать Единицу работы, содержащую новый IdentityUser

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

Вопрос

Мне интересно, что является лучшим способом добавить UserManager в мою Единицу работы. Должен ли я использовать интерфейс IUstrore и добавить новый UserManager в мой контроллер? Должен ли я просто использовать UserManager в своем модуле UnitOfWork или мне нужно сделать что-то другое?

Вот две идеи, которые у меня были для моей единицы работы и реализации контроллера.

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 в своем подразделении работы. Я также создаю пользовательский менеджер для этого userStore в моем контроллере, и я также вызываю dispose на userManager внутри моего контроллера.

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

Популярные ответы

Вам необходимо просмотреть шаблон UnitOfWork. Модель труда и упорство Незнание

Для устранения ошибки убедитесь, что у вас есть следующие фрагменты кода.

  • Ошибка указывает на вызов Dispose из класса Dispose of UnitOfWorkPds.
  • Вы вызываете 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);
    }
}


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему