首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数据映射器、表数据网关( Gateway )、数据访问对象(DAO)和存储库模式之间的区别是什么?

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

Stack Overflow用户
提问于 2009-04-29 23:25:29
回答 2查看 31.3K关注 0票数 139

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

除了命名约定(例如CustomerMapper与CustomerDAO、CustomerGateway与CustomerRepository),如果有区别的话,有什么区别?如果有区别,你什么时候会选择其中一个呢?

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

代码语言:javascript
复制
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上的所有方法都是静态的(我知道,我知道,这会降低它的可测试性),所以我可以像这样调用它:

代码语言:javascript
复制
Customer cust = CustomerGateway.GetCustomerByID(42);

对于数据映射器和存储库模式,这似乎是相同的原则;DAO模式(我认为它与Gateway是同一件事?)似乎也鼓励使用特定于数据库的网关。

我是不是遗漏了什么?有3-4种不同的方式来做同样的事情,这似乎有点奇怪。

EN

回答 2

Stack Overflow用户

发布于 2009-05-02 08:41:33

在软件设计界有一种趋势(至少,我是这样认为的),为众所周知的旧事物和模式创造新的名称。当我们有了一个新的范例(它可能与现有的东西略有不同),它通常会为每一层带来一整套新的名称。因此,“业务逻辑”变成了“服务层”,因为我们说我们做了SOA,DAO变成了存储库,因为我们说我们做了DDD (这些实际上都不是什么新的和独特的东西,但是再说一遍:同一本书中收集的已知概念的新名称)。因此,我并不是说所有这些现代范式和缩略语的含义完全相同,但您真的不应该对此过于偏执。大多数情况下,这些是相同的模式,只是来自不同的家族。

票数 35
EN

Stack Overflow用户

发布于 2009-04-30 00:03:33

你说得很对。选一个你最熟悉的。我想指出一些可能有助于澄清的事情。

表数据网关主要用于单个表或视图。它包含所有selects、inserts、updates和deletes。因此,在您的示例中,Customer是一个表或视图。因此,表数据网关对象的一个实例处理表中的所有行。通常这与每个数据库表中的一个对象相关。

而Data Mapper更独立于任何域逻辑,耦合性更低(尽管我认为存在耦合或不耦合)。它只是一个中间层,用于在对象和数据库之间传输数据,同时保持它们彼此以及映射器本身的独立性。

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

数据传输对象不同于上述两种模式,主要是因为它是一种分布式模式,而不是上述两种模式中的数据源模式。主要在使用远程接口时使用它,并且需要减少调用的闲聊,因为每次调用都会变得很昂贵。因此,通常设计一个DTO,它可以通过网络进行序列化,可以将所有数据传回服务器,以便进一步应用业务规则或进行处理。

我不太精通存储库模式,因为到目前为止我还没有机会使用,但我会看看其他人的答案。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/804751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档