在n层应用程序中使用存储库模型

时间:2014-06-15 13:28:46

标签: entity-framework repository-pattern n-tier-architecture

这是我考虑过的一个主题,并试图让POC工作,但说实话我有点失落。

所以我有一个3层的网络应用程序,传统的DAL,BAL& FE结构用于本练习。

DAL通过实体框架引用了我的数据库,从中我们可以访问单个表JobInfo。

BAL引用DAL项目并具有以下界面:

public interface IJobInfoRepository
{

    IEnumerable<JobInfo> SelectAll();
    JobInfo SelectByID(string id);
    void Insert(JobInfo obj);
    void Update(JobInfo obj);
    void Delete(string id);
    void Save();     
}

然后我有这个班:

public class JobInfoRepository : IJobInfoRepository
{

    public JobInfoRepository()
    {
        _db = new TestEntities();
    }

    public JobInfoRepository(TestEntities db)
    {
        _db = db;
    }

    private TestEntities _db = null;

    public IEnumerable<JobInfo> SelectAll()
    {
        return _db.JobInfoes.ToList();
    }

    public JobInfo SelectByID(string id)
    {
        return _db.JobInfoes.Find(id);
    }

    public void Insert(JobInfo obj)
    {
        _db.JobInfoes.Add(obj);
    }

    public void Update(JobInfo obj)
    {
        _db.Entry(obj).State = EntityState.Modified;
    }

    public void Delete(string id)
    {
        JobInfo existing = _db.JobInfoes.Find(id);
        _db.JobInfoes.Remove(existing);
    }

    public void Save()
    {
        _db.SaveChanges();
    }
}

在我的FE项目中,我引用了BAL项目。但这就是我迷失的地方。如果没有FE访问DAL项目并因此可以看到我的JobInfo实体,那么FE代码如何执行BAL项目中的任何CRUD操作?

谢谢,

戴夫

1 个答案:

答案 0 :(得分:1)

您可以使用两种不同的方法。

  1. 您可以创建仅包含实体定义(POCO类)并从所有项目引用它的项目
  2. 你可以像在1中那样做。但是使用模型并使用AutoMapperValueInjecter
  3. 将它们映射到实体

    2的优点是你真正从你的持久层(DAL)使用的实体中去除了BL和FE中使用的模型。您还可以在BL的模型和您将在FE中显示或编辑的模型之间应用此分析(例如,在MVC中实现视图模型)。

    如果你正在实施一个简单的项目,也许你会满意1.但如果你实现的东西有点复杂,建议使用2。

    顺便说一句,如果你实现一个基础通用存储库(即Repository<T>)并为每个实体继承它,而不是为每个实体实现一个存储库,那么你将节省大量时间,而只实现extar基本存储库中没有的功能。

    使用EF可以很容易地实现通用存储库,因为您可以使用DbSet<T>集合。