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

我正试图刷新我的devise模式技能,我很好奇这些模式之间有什么区别? 他们看起来都是一样的东西 – 封装特定实体的数据库逻辑,所以调用的代码不知道底层的持久层。 从我简短的研究中,他们通常都会实现您的标准CRUD方法,并将数据库特定的细节抽象出来。

除了命名约定(例如,CustomerMapper与CustomerDAO与CustomerGateway与CustomerRepository),有什么区别? 如果有区别,你什么时候select一个呢?

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

public class Customer { 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上的所有方法都是静态的(我知道,我知道这使得它更lesstesting),所以我可以这样调用它:

 Customer cust = CustomerGateway.GetCustomerByID(42); 

这似乎是数据映射器和存储库模式的相同原理; DAO模式(与Gateway相同,我认为?)似乎也鼓励数据库特定的网关。

我错过了什么吗? 有3-4种不同的方式来做同样的事情似乎有点奇怪。

您的示例条款; DataMapper,DAO,DataTableGateway和Repository都有类似的用途(当我使用它的时候,我期望得到一个Customer对象),但是有不同的意图/含义和结果实现。

除了具有更精细的查询能力之外,“ 存储库 ”的行为就像一个集合, [ Evans,Domain Driven Design ],可以被认为是“内存外观中的对象” ( Repository discussion )

一个DataMapper “在对象和数据库之间移动数据,同时保持它们彼此独立和映射器本身” ( Fowler,PoEAA,Mapper )

TableDataGateway“一个网关(封装外部系统或资源访问的对象)到数据库表。一个实例处理表中的所有行 ”( Fowler,PoEAA,TableDataGateway )

DAO “将数据资源的客户端接口与其数据访问机制分开/将特定数据资源的访问API调整为通用客户端接口”允许“数据访问机制独立于使用数据的代码进行更改” ( Sun Blueprints )

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

在软件devise领域有一种倾向(至less我觉得是这样)为知名的旧东西和模式创造新的名字。 当我们有一个新的范式(这可能与现有的东西略有不同)时,通常会为每一层提供一组全新的名称。 所以“业务逻辑”变成了“服务层”,仅仅是因为我们说我们在做SOA,而DAO就是因为我们说我们做了DDD而成为了Repository(而且每一个实际上都不是什么新东西,而且都是独一无二的:新名字对于在同一本书中收集的已知概念)。 所以我并不是说所有这些现代的范式和缩写意思都是一样的,但是你真的不应该太偏执。 大多数这些都是相同的模式,只是来自不同的家庭。

数据映射器与表数据网关长话短说:

  • 数据映射器将接收域模型对象(实体)作为参数,并将使用它来实现CRUD操作
  • 表格数据网关将接收方法的所有参数(作为原语),并且不知道域模型对象(实体)的任何内容。
  • 最后,它们将充当内存中对象和数据库之间的中介。

    你有一个好点。 select一个你最熟悉的人。 我想指出一些可能有助于澄清的事情。

    表格数据网关主要用于单个表格或视图。 它包含所有的select,插入,更新和删除。 所以客户是一个表或您的情况下的视图。 因此,表数据网关对象的一个​​实例处理表中的所有行。 通常这与每个数据库表的一个对象有关。

    虽然数据映射器更独立于任何领域的逻辑和耦合较less(虽然我相信或者有耦合或不耦合)。 它仅仅是一个中介层,用于在对象和数据库之间传输数据,同时保持对象和映射器本身的独立性。

    所以,通常在映射器中,您会看到插入,更新,删除等方法,并在表数据网关中findgetcustomerbyId,getcustomerbyName等。

    数据传输对象不同于上述两种模式,主要是因为它是一种分布模式,而不是上述两种模式的数据源模式。 主要在使用远程接口时使用它,因为每个通话都可能会变得昂贵,所以需要减less通话时间。 所以通常devise一个可以通过线路序列化的DTO,可以将所有数据传回服务器,以便进一步应用业务规则或处理。

    我不太熟悉存储库模式,因为我没有得到使用到现在的机会,但会看别人的答案。