2016-11-23 81 views
1

我已經創建了一個非常基本的存儲庫模式,我想包括一個乾淨的方式來加載相關數據。我已經看到人們使用.Include()以前,但我不是100%確定如何將這個介紹給我的解決方案。如何在存儲庫模式中加載相關數據

這是到目前爲止我的倉庫:

/Repository/IRepository.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace MyProject.Repository 
{ 
    public interface IRepository<T> where T : class 
    { 
     IEnumerable<T> GetAll();   
     T GetById(object Id); 
     void Insert(T obj); 
     void Update(T obj); 
     void Delete(Object Id); 
     void Save(); 
    } 
} 

/Repository/Repository.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using SeaBay.Models; 
using System.Data.Entity; 

namespace MyProject.Repository 
{ 
    public class Repository<T> : IRepository<T> where T : class 
    { 
     private myEntities db; 
     private DbSet<T> dbSet; 

    public Repository() 
    { 
     db = new myEntities(); 
     dbSet = db.Set<T>(); 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return dbSet; 
    } 

    public T GetById(object Id) 
    { 
     return dbSet.Find(Id); 
    } 
    //... etc etc 
} 

基本控制器

public class MyController : Controller 
{ 
    private IRepository<entity> _repository = null; 
    public MyController() 
    { 
     this._repository = new Repository<entity>(); 
    } 

    public ActionResult Index() 
    { 
     var mydata = _repository.GetAll(); 
     return View(mydata); 
    } 

    public ActionResult Details(int Id) 
    { 
     var mydata = _repository.GetById(Id); 
     return View(mydata); 
    } 
} 

可以說例如我有兩張數據表'Student'和'Classes',假如IRepository使用'Student'作爲源代碼,我將如何在存儲庫模式中返回這個相關數據?

回答

1

人們不會回答這個問題的最可能的原因是通用的存儲庫往往會導致非常泄漏的抽象或性能非常差的應用程序(您打算調用GetAll()並僅在返回10000個實體時返回一次顯示25頁?)。從業務層和UI層抽象出數據訪問邏輯非常好,但是嘗試創建一種萬能的方法通常會導致某些過於簡單或過於複雜的事情。

嘗試在通用存儲庫頂部添加一個額外的抽象層,以便每個實體類型都具有相應的存儲庫合約(接口)。然後創建一個實現您的合同的具體存儲庫類。具體類是確定要包含什麼數據以及何時包含的數據,並且可以使用契約來具體描述實體層次結構的複雜性的實體特定方法,重載等。您的業​​務層和UI層(直接或通過依賴注入)將與具體實現進行交互,而不是具體實現業務和UI層的內部

相關問題