2011-02-08 132 views
4

我们正在从ASP.NET Web Forms转移到MVC 2.0。在我们的大部分项目中,我们都有一个典型的设置来与数据库进行通信。ASP.NET MVC:存储库设计的BLL和DAL

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

业务逻辑层(通过调用取消数据访问层)

数据访问层

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

该设计如何转换为存储库设计?我们想用我们自己的数据库帮手而不是NHibernate等。

你会有什么建议?

回答

1

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

+0

我们使用实体/对象在M(模式)时,我们要揭露他们的一个观点。否则,我们现在将它们放入一个单独的Domain类库中。但是如何使用存储库设计?并在哪里把数据库调用(通用和数据库特定)?也许它只是一个命名的东西,但欢迎你! – jpderooy 2011-02-08 13:34:04

+0

存储库只不过是在您的DAL类上使用任何数据库技术而不同。我不想深入了解Repository与DAL类的不同之处,这是一个简单的谷歌查询。但实质上,它们服务于类似的目的。否则,您仍然会在您的控制器中创建一个BLL类的实例,这反过来会创建一个Repository实例,最终将实体一直返回用作MVC中的M. – e36M3 2011-02-08 13:37:34

3

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

存储库具有至少:

  1. GET-对象通过键操作(多个)
  2. GET-所有对象操作
  3. GET-第一物体通过查询操作( S)
  4. 找对象,通过查询操作(S)

一个很简单的例子:):

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; } 
} 

查询IRepositoryIUnitOfWork B.类中定义DAL.interfaces.dll常见.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意识到了改变的实体。保存()为每个更改的实体调用适当的DatabaseHelper/OdbcHelper CRUD方法,以便将更改保留在数据库中。

IRepository <产品> ... IRepository <EntityXY>IUnitOFWork的实施应放置在DAL。 BLL然后使用IR知识库IUnitOFWork以实现业务(域)逻辑。 BLL本身可以被组织为服务层,位于域模型的顶部,但它超出了讨论的范围:)。

我希望我的回答有帮助。

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

链接: Patterns of enterpise application architecture by Martin Fowler