4

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

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

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

数据访问层

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

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

你有什么建议?

4

2 回答 2

3

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

一个存储库至少有:

  1. 按键获取对象操作
  2. 获取所有对象操作
  3. Get-first-object-by-query 操作
  4. Get-objects-by-query 操作

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

A.产品类别,在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<Product>, ... IRepository<EntityXY>IUnitOFWork的实现应该放在 DAL 中。BLL 然后使用IRepositoryIUnitOFWork来实现业务(域)逻辑。BLL 本身可以组织为域模型之上的服务层,但它超出了讨论的范围:)。

我希望我的回答有帮助。

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

链接: Martin Fowler 的企业应用程序架构模式

于 2011-04-20T20:12:53.943 回答
1

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

于 2011-02-08T13:24:11.003 回答