【问题标题】:Using repository model in n-tiered application在 n 层应用程序中使用存储库模型
【发布时间】:2014-06-15 13:28:46
【问题描述】:

这是一个我已经考虑过并试图让 POC 工作的主题,但老实说我有点迷失了。

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

DAL 通过 Entity Framework 引用了我的数据库,由此我们可以访问单个表 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 项目。但这就是我迷路的地方。如果不授予对 DAL 项目的 FE 访问权限,因此无法查看我的 JobInfo 实体,FE 代码如何执行 BAL 项目中的任何 CRUD 操作?

谢谢,

戴夫

【问题讨论】:

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


    【解决方案1】:

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

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

    2 的优点是您真正将 BL 和 FE 中使用的模型与持久层 (DAL) 使用的实体解耦。您还可以在 BL 模型和您将在 FE 中显示或编辑的模型(例如在 MVC 中实现视图模型)之间应用这种区分。

    如果您正在实施一个简单的项目,也许您会对 1 感到满意。但如果您正在实施一些更复杂的项目,建议使用 2。

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

    使用 EF 很容易实现通用存储库,因为您可以使用 DbSet&lt;T&gt; 集合。

    【讨论】:

    • 2. 的一个缺点是你会浪费时间来不断地映射。我会选择 1。
    • 对于我最近在工作中所做的一个项目,我采用了第 1 点中提到的方法,对于需要的项目来说,它已经足够了。但自从这样做以来,我一直在唠叨我要找到更好的方法并将 FE 与 DAL 完全分离。
    • 在我必须尝试之前从未使用过 AutoMapper 或 ValueInjector。 AutoMapper 是不是很臃肿,我刚才在一篇文章里提到过:rogeralsing.com/2013/12/01/…
    • @user3742300 在这里查看我的回答stackoverflow.com/a/21361903/1017868 关于使用通用存储库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2015-06-09
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多