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. Query、IRepository 和 IUnitOfWork 的类在 DAL.interfaces.dll 或 Common.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
希望我的回答对你有帮助。
请随时问我一个问题...
链接: 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 5)