ASP.NET MVC:BLL 和 DAL 到存储库设计

Posted

技术标签:

【中文标题】ASP.NET MVC:BLL 和 DAL 到存储库设计【英文标题】:ASP.NET MVC: BLL and DAL to Repository design 【发布时间】:2011-06-23 10:32:51 【问题描述】:

我们正在从 ASP.NET Web 窗体迁移到 MVC 2.0。在我们的大多数项目中,我们都有与数据库通信的典型设置。

通用(对象/实体,如“SiteMenu”和“用户”)

业务逻辑层(调用数据访问层)

数据访问层

DAL 有一个带有通用数据库操作的 DatabaseHelper、一个带有数据库特定操作(例如 mysql)的 OdbcHelper 和一个带有所有存储过程的 StoredProcedure 类。

如何将此设计转化为存储库设计?我们想使用我们自己的数据库助手而不是 NHibernate 等。

你有什么建议?

【问题讨论】:

【参考方案1】:

您可以利用所有数据访问技术来利用存储库。 repository 是对现有数据访问助手/服务的抽象,允许将业务逻辑与数据访问层分离。与 Query 一起使用以启用过滤的存储库。它通常与工作单元一起使用,将更改存储回数据库。

一个仓库至少有:

    按键获取对象操作 获取所有对象操作 通过查询操作获取第一个对象 通过查询操作获取对象

一个非常简单的例子:):

A. Product 类,在Common中定义:

public class Product

    public int Id  get; private set; 

    public string Code  get; set; 

    public string Name  get; set; 

    public decimal Price  get; set; 

B. QueryIRepositoryIUnitOfWork 的类在 DAL.interfaces.dllCommon.dll 中定义(但不在 DAL 中!)。

public class Query

    public string Text  get; set; 


public interface IRepository<TEntity>
    where TEntity : class

    bool TryGet(int key, out TEntity value);

    TEntity this[int key]  get; 

    IEnumerable<TEntity> GetAll();

    bool TryGetFirst(Query condition, out TEntity value);

    TEntity GetFirst(Query condition);

    IEnumerable<TEntity> GetAll(Query condition);

    int Count  get; 



public interface IUnitOfWork

    void SetAdded(TEntity value); // Marks entity as added for further INSERT

    void SetRemoved(TEntity value); // Marks entity as removed for further DELETE

    void SetChanged(TEntity value); // Marks entity as modified for further UPDATE

    void Save(); // Save all the changes 

IUnitOfWork 知道已更改的实体。 Save() 为每个更改的实体调用适当的 DatabaseHelper / OdbcHelper CRUD 方法,以便将更改持久保存在数据库中。

IRepository, ... IRepositoryIUnitOFWork 的实现应该放在 DAL 中。 BLL 然后使用 IRepositoryIUnitOFWork 来实现业务(域)逻辑。 BLL 本身可以组织为 领域模型 之上的服务层,但它不在讨论范围内:)。

希望我的回答对你有帮助。

请随时问我一个问题...

链接: Patterns of enterpise application architecture by Martin Fowler

【讨论】:

【参考方案2】:

在迁移到 MVC 时,您可以保持相同的分层方法。返回实体/对象的 BLL 可以是 MVC 中的 M。通常,您会在示例中看到人们直接在他们的 Controller 中创建存储库的实例,在您的情况下,您将创建 BLL 类的实例。

【讨论】:

当我们想要将实体/对象暴露给视图时,我们会使用 M(模型)中的实体/对象。否则,我们现在将它们放入单独的域类库中。但是如何使用存储库设计?以及将数据库调用(通用和特定于数据库)放在哪里?也许它只是一个命名的东西,但欢迎任何想法! 存储库只不过是 DAL 类的不同旋转,它利用您使用的任何数据库技术。我不想详细了解存储库与您的 DAL 类有何不同,这是一个简单的谷歌查询。然而本质上它们服务于类似的目的。否则,您仍然会在控制器中创建 BLL 类的实例,而控制器又会创建 Repository 的实例,最终将实体一路返回以用作 MVC 中的 M。 嗨,这是有道理的。我认为 Repository DAL 的区别或相似性不清楚(即使通过谷歌搜索)。你能给我一些关于设置的更多信息吗?实体、业务逻辑和与数据库通信的存储库?在哪里 - 在逻辑文件夹结构和名称中 - 我们是否放置数据库特定操作,例如 db.run()?谢谢! 我认为 Repositories 与 Entity Framework 或 NHibernate 等 ORM 配合得非常好。您使用的可能更像是 DAO(数据访问对象)。 Here is a good starting point。谈到建筑,没有一个正确的答案,我也绝不是专家。您的 Controller 的典型设置会创建业务层对象的实例,该实例会创建返回实体的数据访问对象(存储库或 dao)的实例,这是一种绝对正确的方法。

以上是关于ASP.NET MVC:BLL 和 DAL 到存储库设计的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 的三层架构 + EF数据模型

如何将数据从表示层传递到业​​务逻辑层? (ASP.NET MVC 5)

Asp.Net MVC+EF+三层架构的完整搭建过程

ASP.NET中MVC的理解

在ASP.NET中,三层架构,Web ,BLL,DAL,Models这四个的引用关系是?

asp.net中的三层架构是啥意思?mvc设计模式是啥?它们之间有关系吗?