对象引用未设置为存储库层对象的实例

Object Reference Not Set to an Instance of an Object at Repository Layer

提问人:RaZzLe 提问时间:11/29/2018 最后编辑:RaZzLe 更新时间:11/29/2018 访问量:2288

问:

我在我的框架上收到空异常错误。我尝试在我的应用程序中应用存储库和工作单元设计模式。我试图做的只是使用方法从我的数据库中检索用户标题。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());
        }
    }
}

顺便说一句,它只是另一个 API 控制器,它继承了所有其他 API 控制器,并包含所有其他控制器使用的方法。BaseController

所以,我仍然在努力提高我在这个设计模式上的自我,如果有人能在课堂上展示我的错误,我会很高兴。正如我所说,我想问题是由那条线引起的。另一方面,我不知道如何纠正它,因为我的操作类的构造函数要求。BaseManagerprivate readonly XaPaDataContext _context;IUnitOfWork

先谢谢你!

编辑:

刚刚意识到我忘了分享我的工作单元类:

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();
    }
}
C# 实体框架 存储库模式 nullreferenceException 工作单元

评论

1赞 Jon Skeet 11/29/2018
一开始我会很紧张。如果不是 ,则返回 null - 因此,您最终会得到一个 null 引用传播到其他地方,从而很难弄清楚发生了什么。如果改为强制转换,则如果类型不是预期的类型,则会在失败时收到更具体的错误。这可能是也可能不是问题(你应该调试以解决哪里出了问题),但我建议你无论如何都要改变它。get { return Context as XaPaDataContext; }ContextXaPaDataContext
2赞 TheGeneral 11/29/2018
你的第一个问题是你正在使用一个存储库模式而不是实体框架,你已经高兴地,把你自己抽象到另一层维护和复杂性中,几乎没有收获,你的第二个问题是你还没有调试这个
0赞 RaZzLe 11/29/2018
好吧,我当然已经调试过了,系统在之后抛出异常return Context.Set<T>().ToList();

答:

0赞 RaZzLe 11/29/2018 #1

在我更改了我的 BaseManager 类之后,如下所示:

public abstract class BaseManager
{
    private IUnitOfWork _iUow;

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

            return _iUow;
        }
    }
}

我已努力接受HttpStatusCode.OK

但是,老实说,我仍然不确定真正的原因。我主要用心做这个更正。