我们正在从 ASP.NET Web 窗体迁移到 MVC 2.0。在我们的大多数项目中,我们都有一个典型的设置来与数据库进行通信。
常见的 (对象/实体,如“SiteMenu”和“Users”)
业务逻辑层 (调用数据访问层)
数据访问层
DAL 有一个带有通用数据库操作的 DatabaseHelper,一个带有数据库特定操作(例如 MySQL)的 OdbcHelper 和一个带有所有存储过程的 StoredProcedure 类。
这种设计如何转化为存储库设计?我们想使用我们自己的数据库助手而不是 NHibernate 等。
你有什么建议?
最佳答案
您可以使用每种数据访问技术来利用存储库。
存储库 是对现有数据访问助手/服务的抽象,允许将业务逻辑与数据访问层分离。存储库与 Query 一起使用以启用过滤。它通常与 工作单元 一起使用以将更改存储回数据库。
一个存储库至少有:
一个非常简单的例子:):
A. 产品 类,定义在 常见的 中:
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. 查询 、 IRepository 和 IUnitOfWork 的类在 DAL.interfaces.dll 或 Common.dll 中定义( 中)。
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, ... IRepository 和 IUnitOFWork 的实现应该放在 DAL 中。然后 BLL 使用 IRepository 和 IUnitOFWork 来实现业务(域)逻辑。 BLL 本身可以在 域模型 之上组织为 服务层 ,但这不在讨论范围内:)。
希望我的回答有帮助。
请随时问我一个问题...
链接:
Patterns of enterpise application architecture by Martin Fowler
关于asp.net-mvc - ASP.NET MVC : BLL and DAL to Repository design,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4933483/