2017-10-08 119 views
0

我目前正在學習接口和存儲庫模式,並且遇到困難。我有域類 「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; } 
} 

和類 「VehicleRepository」,它實現該接口

public class VehicleRepository : IVehicleRepository 
{ 
    private readonly VehicleDbContext _context; 

    public VehicleRepository(VehicleDbContext context) 
    { 
     _context = context; 
    } 

    public IEnumerable<VehicleMake> All => _context.VehicleMakes; 
} 

我的DbContext類以下

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

所以問題是,當我試圖在我的控制器中檢索「車輛進行」,我得到空引用例外,我不知道爲什麼。我是否正確實施了這個?如果沒有,那麼做到這一點的正確方法是什麼?

+0

在VehicleController刪除參數的構造函數,並請有一個測試 –

+0

當我刪除它,我得到以下錯誤:「System.MissingMethodException:沒有爲此對象定義的無參數構造函數。」 – iantukic

+0

發佈了一個答案,以使您的代碼正常工作。請看一看。 –

回答

0

你得到NullReferenceException,因爲它調用你的無參數構造函數,你沒有_ vehicleRepository字段的初始化。你的初始化是在構造函數中你傳遞對象的地方。

我相信,你沒有依賴注入框架註冊正確獲取實例。所以,你可以簡單地初始化_ 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; 
}