ASP.NET MVC:BLL和DAL到Repository设计

时间:2011-02-08 13:16:16

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

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

常见(像'SiteMenu'和'用户'这样的对象/实体)

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

数据访问层

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

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

你会建议什么?

2 个答案:

答案 0 :(得分:3)

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

存储库至少包含:

  1. 逐个对象操作
  2. 获取所有对象操作
  3. 先获取对象查询操作
  4. 按查询对象获取操作
  5. 一个非常简单的例子:):

    一个。 产品类,在 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中。 查询 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&lt; Product&gt;,... IRepository&lt; EntityXY&gt; IUnitOFWork 的实施应该放在DAL中。然后,BLL使用 IRepository IUnitOFWork 来实现业务(域)逻辑。 BLL本身可以在域模型的顶部组织为服务层,但它超出了讨论的范围:)。

    我希望我的回答有所帮助。

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

    链接: Patterns of enterpise application architecture by Martin Fowler

答案 1 :(得分:1)

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