ASP.NET MVC: BLL和DAL转换为Repository设计

4
我们正在从ASP.NET Web Forms转移到MVC 2.0。在我们的大多数项目中,我们都有一个典型的设置来与数据库通信。
常见的对象/实体,如“SiteMenu”和“Users”。
业务逻辑层(调用数据访问层)。
数据访问层。
DAL具有DatabaseHelper,其中包含常见的数据库操作;OdbcHelper,其中包含特定于数据库的操作(例如MySQL);以及StoredProcedure类,其中包含所有存储过程。
如何将此设计转换为存储库设计?我们想使用自己的数据库帮助程序,而不是NHibernate等工具。
您建议怎么做?
2个回答

3
您可以利用各种数据访问技术来利用存储库。一个存储库是对现有数据访问帮助器/服务的抽象,允许将业务逻辑与数据访问层解耦。存储库与查询一起使用以启用过滤。它通常与工作单元一起使用,将更改存储回数据库。
存储库至少具备以下功能:
1. 按键获取对象操作 2. 获取所有对象操作 3. 按查询获取第一个对象操作 4. 按查询获取对象操作
下面是一个非常简单的例子:)
A. 在Common中定义了Product类:
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. DAL.interfaces.dllCommon.dll 中定义了 QueryIRepositoryIUnitOfWork 的类(但不包括在 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 的企业应用架构模式


1

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


当我们想要将实体/对象暴露给视图时,在M(模型)中使用它们。否则,我们现在将它们放在单独的域类库中。但如何使用存储库设计?以及在哪里放置数据库调用(通用和特定于数据库)?也许这只是一个命名问题,但欢迎任何想法! - jpderooy
存储库(repository)本质上只是您的DAL类的不同变体,它们利用您使用的任何数据库技术。我不想深入讨论存储库与DAL类的区别,这可以通过简单的谷歌查询得到答案。但本质上它们具有相似的作用。否则,您仍将在控制器中创建BLL类的实例,该实例反过来将创建存储库的实例,并最终将实体返回到MVC中用作M。 - e36M3
嗨,这很有道理。我认为存储库<>数据访问层的区别或相似之处不太清楚(即使通过谷歌搜索)。您能否给我一些关于设置的更多信息?实体、业务逻辑和与数据库通信的存储库?我们在哪里 - 在逻辑文件夹结构和名称中 - 放置特定于数据库的操作,例如db.run()等?谢谢! - jpderooy
我认为仓储库与像Entity Framework或NHibernate这样的ORM非常配合。你正在使用的可能更像是DAO(数据访问对象)。这是一个很好的起点。当涉及到架构时,没有一个正确的答案,而且我绝不是专家。控制器的典型设置创建业务层对象的实例,该对象创建数据访问对象(仓储库或DAO)的实例,该对象返回实体是一种绝对正确的方法。 - e36M3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接