2016-11-23 66 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层的内部

相关问题