Ссылка на объект не установлена ​​для экземпляра объекта на уровне хранилища - PullRequest
0 голосов
/ 29 ноября 2018

Я получаю сообщение об ошибке исключения в моей структуре.Я пытался применить шаблоны проектирования репозитория и единицы работы в своем приложении.Я пытаюсь просто извлечь названия пользователей из моей базы данных методом GetAll().

Вот мой класс хранилища:

public class Repository<T> : IRepository<T> where T : class
{
    protected readonly DbContext Context;

    public Repository(DbContext context)
    {
        this.Context = context;
    }

    public T Get(int id)
    {
        return Context.Set<T>().Find(id);
    }

    public IEnumerable<T> GetAll()
    {
        return Context.Set<T>().ToList();
    }

    public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
    {
        return Context.Set<T>().Where(predicate);
    }

    public void Add(T entity)
    {
        Context.Set<T>().Add(entity);
    }

    public void AddRange(IEnumerable<T> entityList)
    {
        Context.Set<T>().AddRange(entityList);
    }

    public void Remove(T entity)
    {
        Context.Set<T>().Remove(entity);
    }

    public void RemoveRange(IEnumerable<T> entityList)
    {
        Context.Set<T>().RemoveRange(entityList);
    }
}

Это IUserTitlesRepository:

public interface IUserTitlesRepository : IRepository<UserTitles>
{

}

И класс, в котором реализован интерфейс, описанный выше:

    public UserTitlesRepository(XaPaDataContext context) : base(context)
    {

    }

    public XaPaDataContext XaPaDataContext
    {
        get { return Context as XaPaDataContext; }
    }

Прежде чем перейти на уровень контроллера, у меня есть еще два уровня, которые представляют собой уровни операций и диспетчера.И я думаю, что я запутался в этой части (в классе Base Manager, как показано ниже).

Это уровень операций:

public class UserTitlesOperations
{
    private readonly IUnitOfWork _uow;

    public UserTitlesOperations(IUnitOfWork uow)
    {
        _uow = uow;
    }

    public List<UserTitles> GetAllUserTitles()
    {
        try
        {
            List<UserTitles> userTitleList = _uow.UserTitles.GetAll().ToList();
            _uow.Complete();
            return userTitleList;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.ToString());
        }
    }
}

Ниже приведен класс BaseManager, который даетнаследование всех классов менеджера.

public abstract class BaseManager
{
    private IUnitOfWork _iUow;

    private readonly XaPaDataContext _context;

    public IUnitOfWork IUOW
    {
        get
        {
            if (_iUow == null)
            {
                _iUow = new XaPaUnitOfWork(_context);
            }

            return _iUow;
        }
    }
}

Это класс менеджера:

public class UserTitlesManager : BaseManager
{
    private readonly UserTitlesOperations _userTitlesOperations;

    public UserTitlesManager()
    {
        _userTitlesOperations = new UserTitlesOperations(base.IUOW);
    }

    public List<UserTitlesWM> GetAllUserTitles()
    {
        try
        {
            return UserTitlesMapping.MaptoWM(_userTitlesOperations.GetAllUserTitles());
        }
        catch (Exception ex)
        {
            throw new Exception(ex.ToString());
        }
    }
}

Наконец, это мой контроллер API:

[Route("api/LoginRequest")]
public class TitlesController : BaseController
{
    UserTitlesManager _userTitlesManager;

    public LoginController()
    {
        _userTitlesManager = new UserTitlesManager();
    }

    [Route("RetreiveTitles")]
    public HttpResponseMessage GetTitles()
    {
        try
        {
            return Request.CreateResponse(HttpStatusCode.OK, _userTitlesManager.GetAllUserTitles());
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.ToString());
        }
    }
}

КстатиBaseController - это просто еще один API-контроллер, который дает наследование всем другим API-контроллерам и содержит метод, который используется всеми другими контроллерами.

Итак, я все еще пытаюсь отточить свое мнение об этом проектешаблонов и был бы рад, если бы кто-нибудь мог показать мою ошибку в классе BaseManager.Как я уже сказал, я полагаю, что проблема вызвана этой private readonly XaPaDataContext _context; строкой.С другой стороны, я не могу понять, как исправить это, поскольку конструкторы моих классов операций запрашивают IUnitOfWork.

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Только что понял, что забыл поделиться своим классом Unit of Work:

public class XaPaUnitOfWork : IUnitOfWork
{
    private readonly XaPaDataContext _context;

    public XaPaUnitOfWork(XaPaDataContext context)
    {
        _context = context;
        Categories = new CategoriesRepository(_context);
        OrderDetails = new OrderDetailsRepository(_context);
        Orders = new OrdersRepository(_context);
        ProductImages = new ProductImagesRepository(_context);
        Products = new ProductsRepository(_context);
        Users = new UsersRepository(_context);
        UserTitles = new UserTitlesRepository(_context);
        UserTokens = new UserTokensRepository(_context);
    }

    public ICategoriesRepository Categories { get; private set; }
    public IOrderDetailsRepository OrderDetails { get; private set; }
    public IOrdersRepository Orders { get; private set; }
    public IProductImagesRepository ProductImages { get; private set; }
    public IProductsRepository Products { get; private set; }
    public IUsersRepository Users { get; private set; }
    public IUserTitlesRepository UserTitles { get; private set; }
    public IUserTokensRepository UserTokens { get; private set; }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

1 Ответ

0 голосов
/ 29 ноября 2018

После того, как я изменил свой класс BaseManager, как показано ниже:

public abstract class BaseManager
{
    private IUnitOfWork _iUow;

    public IUnitOfWork IUOW
    {
        get
        {
            if (_iUow == null)
            {
                _iUow = new XaPaUnitOfWork(new XaPaDataContext());
            }

            return _iUow;
        }
    }
}

Я получил, чтобы получить HttpStatusCode.OK

Но, честно говоря, я все еще не уверен в истинной причине.Я делаю это исправление в основном наизусть.

...