数据映射器、表数据网关(Gateway)、数据访问对象(DAO)和存储库模式之间有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (77)

我正在努力学习我的设计模式技能,我很好奇这些模式之间有什么区别?它们看起来都是一样的,封装特定实体的数据库逻辑,因此调用代码不了解底层持久层。从我的简短研究来看,所有这些方法都实现了标准CRUD方法,并抽象出了特定于数据库的细节。

除了命名约定(例如CustomerMapper与CustomerDAO对CustomerGateway与CustomerRepository)之外,如果有什么区别呢?如果有区别,你什么时候会选择一个而另一个?

在过去,我会编写类似于以下代码的代码(简化,自然-我通常不会使用公共属性):

public class Custome
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

并且有一个CustomerGateway类,该类为所有方法实现特定的数据库逻辑。有时,我不会使用接口并使CustomerGateway上的所有方法都是静态的(我知道,这使得它的可测试性降低了),所以我可以这样称呼它:

Customer cust = CustomerGateway.GetCustomerByID(42);

对于DataMapper和Repository模式来说,这似乎是相同的原则;DAO模式(我认为它与Gateway相同)似乎也鼓励了特定于数据库的网关。

提问于
用户回答回答于

示例术语;DataMapper、DAO、DataTableGateway和Repository都有类似的用途(当我使用其中之一时,我希望返回一个Customer对象),但是意图/含义不同,结果是实现。

储存库“行为像一个集合,除非具有更精细的查询功能,并可视内存外观中的对象DataMapper在对象和数据库之间移动数据,同时保持它们彼此独立和映射器本身独立

TableDataGateway“对数据库表的网关(封装对外部系统或资源的访问的对象)

将数据资源的客户端接口与其数据访问机制分离,使特定数据资源的访问API适应于通用客户端接口允许“独立于使用数据的代码更改的数据访问机制”

存储库似乎非常通用,没有公开数据库交互的概念。DAO提供了一个接口,可以使用不同的底层数据库实现。TableDataGateway特别是一个表的薄包装器。DataMapper充当中介,使Model对象能够独立于数据库表示(随着时间的推移)而发展。

用户回答回答于

软件设计界有一种趋势(至少我觉得是这样),那就是为众所周知的旧事物和模式发明新的名称。当我们有了一个新的范例(它可能与已经存在的事物略有不同)时,它通常会为每一层提供一整套新的名称。因此,“业务逻辑”之所以成为“服务层”,仅仅是因为我们说我们要做SOA,而DAO之所以成为存储库,仅仅是因为我们说我们做了DDD(而且这些内容实际上并不是什么新的和唯一的东西,而是同样的:在同一本书中已经知道的概念的新名称)。所以我并不是说所有这些现代范例和缩略语都是完全相同的,但你真的不应该太偏执。大多数情况下,这些模式是相同的,只是来自不同的家庭。

扫码关注云+社区