之间有什么区别的数据映射器,表中数据的网关(Gateway)、数据访问的对象(道)和资源库模式?

StackOverflow https://stackoverflow.com/questions/804751

我试图刷上了我的设计图案的技能和我很好奇是什么之间的差异,这些模式?他们都看起来像他们是相同的-封装的数据库的逻辑为特定实体所调用的代码有没有知识基础的持久性层。从我的简短研究所有的它们通常执行标准的污物的方法和抽象离开该数据库特定的细节。

除了命名约定(例如CustomerMapper与CustomerDAO与CustomerGateway与CustomerRepository),有什么区别,如果有的话?如果是有区别的,当你选择了一个?

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

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静态(我知道,我知道,这使得它不可测试),所以我可以叫它,如:

Customer cust = CustomerGateway.GetCustomerByID(42);

这似乎是同样的原则对于该数据映射器和储存库的模式;该岛的模式(这是同样的事情,因为网关,我觉得吗?) 似乎也鼓励数据库特定的网关。

我失去了一些东西?这似乎有点奇怪,有3-4个不同的方式做同样的事情。

有帮助吗?

解决方案

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

存储库 “就像集合一样,除了更精细的查询功能” [ Evans,域驱动设计]并且可能被视为内存外观中的”对象“存储库讨论

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

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

DAO “将数据资源的客户端接口与其数据访问机制分开/将特定数据资源的访问API调整为通用客户端接口”允许 “数据访问机制独立于使用数据的代码而改变”太阳蓝图

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

其他提示

软件设计世界(至少我觉得如此)有一种趋势是为众所周知的旧事物和模式创造新名称。当我们有一个新的范例(可能与已有的东西略有不同)时,它通常会为每一层提供一整套新名称。所以“业务逻辑”成为“服务层”仅仅因为我们说我们做SOA,而DAO成为Repository只是因为我们说我们做了DDD(而且每个都不是新的和独特的东西,但是又一次:在同一本书中收集的已知概念的新名称) 。所以我并不是说所有这些现代范式和首字母缩略词都完全相同,但你真的不应该对此过于偏执。这些都是相同的模式,只来自不同的家庭。

你有一个好的点。挑选一个你们最熟悉的。我要指出几件事情,可以帮助澄清。

表中数据网关,主要用于一个单一的表格或图。它包含所有选择,插入、更新和删除。所以,客户是一个表格,或查看你的情况。因此,一个实例表数据网关目处理的所有行表中。通常这是关系到一个对象每个数据库表。

虽然数据映射是更多的独立的任何领域逻辑和小耦合(尽管我相信,有联接或不耦合)。它仅仅是一个中间层的数据传送对象之间和一个数据库,同时保持它们彼此独立和映射器本身。

因此,通常在映射器,你看到的方法插入、更新、删除和表数据网关,你会发现getcustomerbyId,getcustomerbyName,等等。

数据传送对象不同于上述两种模式,主要是因为它是一种分布模式并不是一个数据源的模式上述两个模式。使用这主要是当你是工作用的远程接口和需要你的电话不太健谈的,因为每个电话可以获得昂贵。因此,通常设计也可与检它可能的序列化在线,可以携带的所有数据回到服务器施加进一步的业务规则或处理。

我不精通在储存库的图案,因为我没有得到一个机会,来使用,直到现在,但将寻求在其他的答案。

以下是我的理解。

<强> TableGateWay / RowDataGateWay : 在此上下文中,Gateway指的是具有每个“域对象”的特定实现。映射到每个“域对象网关”。例如,如果我们有 Person ,那么我们将有一个 PersonGateway 来将域对象Person存储到数据库。如果我们有人员,员工,客户等,我们将拥有PersonGateway,EmployeeGateway和CustomerGateway。每个网关都具有该对象的特定CRUD功能,它与其他网关无关。这里没有可重用的代码/模块。网关可以进一步分为RowDataGateway或TableGateway,取决于你是否传递了“id”。或“对象”。网关通常与Active记录进行比较。它将您的域模型与数据库模式联系起来。

Repository / DataMapper / DAO :它们是一回事。它们都引用将数据库实体传输到域模型的持久层。与网关不同,Repository / DataMapper / DAO隐藏了实现。你不知道Person背后是否有PersonGateway。它可能,也可能不是,你不关心。所有你知道的是它必须支持每个域对象的CRUD操作。它解耦数据源和域模型。

scroll top