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

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

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

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

数据访问层

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

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

你有什么建议?

【问题讨论】:

    标签: asp.net-mvc repository data-access-layer bll


    【解决方案1】:

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

    一个仓库至少有:

    1. 按键获取对象操作
    2. 获取所有对象操作
    3. 通过查询操作获取第一个对象
    4. 通过查询操作获取对象

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

    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)的实例,这是一种绝对正确的方法。
      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 2012-07-13
      • 2010-09-22
      • 2011-01-23
      • 2014-03-23
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多