无法使用存储库模式从数据库中检索数据
Unable to retrieve data from database using repository pattern
我目前正在学习接口和存储库模式,但遇到了困难。我有域名 class "VehicleMake"
public class VehicleMake
{
public VehicleMake()
{
}
[Key]
[Column(Order = 1)]
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
public virtual ICollection<VehicleModel> VehicleModels { get; set; }
}
我还有一个接口"IVehicleRepository"
public interface IVehicleRepository
{
IEnumerable<VehicleMake> All { get; }
}
和实现该接口的 class "VehicleRepository"
public class VehicleRepository : IVehicleRepository
{
private readonly VehicleDbContext _context;
public VehicleRepository(VehicleDbContext context)
{
_context = context;
}
public IEnumerable<VehicleMake> All => _context.VehicleMakes;
}
我的 DbContext class 正在关注
public class VehicleDbContext : DbContext
{
public VehicleDbContext() : base("VehicleDbContext")
{
}
public DbSet<VehicleMake> VehicleMakes { get; set; }
public DbSet<VehicleModel> VehicleModels { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
我的"VehicleController"正在关注
public class VehicleController : Controller
{
private readonly IVehicleRepository _vehicleRepository;
public VehicleController()
{
}
public VehicleController(IVehicleRepository vehicleRepository)
{
_vehicleRepository = vehicleRepository;
}
// GET: VehicleMakes
public ActionResult Index()
{
return View(_vehicleRepository.All);
}
}
所以问题是,当我尝试在我的控制器中检索 "Vehicle Makes" 时,我得到空引用异常,但我不知道为什么。我是否正确实施了这个?如果不是,正确的方法是什么?
你得到 NullReferenceException
因为它调用你的无参数构造函数,而你没有初始化 _vehicleRepository
字段。您的初始化是在您传递 IVehicleRepository
对象的构造函数中进行的。
我相信,您没有注册依赖注入框架来正确获取实例。因此,您可以简单地在默认构造函数中初始化 _vehicleRepository
:
public class VehicleController : Controller
{
private readonly IVehicleRepository _vehicleRepository;
public VehicleController()
{
_vehicleRepository = new VehicleRepository();
}
// GET: VehicleMakes
public ActionResult Index()
{
return View(_vehicleRepository.All);
}
}
通过以下方式更改您的 VehicleRepository 以支持默认构造函数:
public class VehicleRepository : IVehicleRepository
{
private readonly VehicleDbContext _context;
public VehicleRepository() : this(new VehicleDbContext())
{
}
public VehicleRepository(VehicleDbContext context)
{
_context = context;
}
public IEnumerable<VehicleMake> All => _context.VehicleMakes;
}
我目前正在学习接口和存储库模式,但遇到了困难。我有域名 class "VehicleMake"
public class VehicleMake
{
public VehicleMake()
{
}
[Key]
[Column(Order = 1)]
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
public virtual ICollection<VehicleModel> VehicleModels { get; set; }
}
我还有一个接口"IVehicleRepository"
public interface IVehicleRepository
{
IEnumerable<VehicleMake> All { get; }
}
和实现该接口的 class "VehicleRepository"
public class VehicleRepository : IVehicleRepository
{
private readonly VehicleDbContext _context;
public VehicleRepository(VehicleDbContext context)
{
_context = context;
}
public IEnumerable<VehicleMake> All => _context.VehicleMakes;
}
我的 DbContext class 正在关注
public class VehicleDbContext : DbContext
{
public VehicleDbContext() : base("VehicleDbContext")
{
}
public DbSet<VehicleMake> VehicleMakes { get; set; }
public DbSet<VehicleModel> VehicleModels { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
我的"VehicleController"正在关注
public class VehicleController : Controller
{
private readonly IVehicleRepository _vehicleRepository;
public VehicleController()
{
}
public VehicleController(IVehicleRepository vehicleRepository)
{
_vehicleRepository = vehicleRepository;
}
// GET: VehicleMakes
public ActionResult Index()
{
return View(_vehicleRepository.All);
}
}
所以问题是,当我尝试在我的控制器中检索 "Vehicle Makes" 时,我得到空引用异常,但我不知道为什么。我是否正确实施了这个?如果不是,正确的方法是什么?
你得到 NullReferenceException
因为它调用你的无参数构造函数,而你没有初始化 _vehicleRepository
字段。您的初始化是在您传递 IVehicleRepository
对象的构造函数中进行的。
我相信,您没有注册依赖注入框架来正确获取实例。因此,您可以简单地在默认构造函数中初始化 _vehicleRepository
:
public class VehicleController : Controller
{
private readonly IVehicleRepository _vehicleRepository;
public VehicleController()
{
_vehicleRepository = new VehicleRepository();
}
// GET: VehicleMakes
public ActionResult Index()
{
return View(_vehicleRepository.All);
}
}
通过以下方式更改您的 VehicleRepository 以支持默认构造函数:
public class VehicleRepository : IVehicleRepository
{
private readonly VehicleDbContext _context;
public VehicleRepository() : this(new VehicleDbContext())
{
}
public VehicleRepository(VehicleDbContext context)
{
_context = context;
}
public IEnumerable<VehicleMake> All => _context.VehicleMakes;
}