我想刷了我的设计模式的技能,我很好奇什么是这些模式之间的区别是什么?它们似乎都是一样的东西——封装特定实体的数据库逻辑,因此调用代码不知道底层持久层。从我的简短研究所有这些通常实现你的标准的CRUD方法和抽象掉了数据库的具体细节。

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

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

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 类,它实现了所有方法的特定数据库逻辑。有时我不会使用接口(interface),而是将 CustomerGateway 上的所有方法都设为静态(我知道,我知道,这会降低可测试性),因此我可以这样称呼它:
Customer cust = CustomerGateway.GetCustomerByID(42);

这似乎与 Data Mapper 和 Repository 模式的原理相同; DAO模式(这是同样的事情网关,我觉得呢?)也似乎是鼓励特定数据库的网关。

我错过了什么吗?这似乎有点不可思议有3-4个不同的做同样的事情的方式。

最佳答案

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

一个 存储库 “就像一个集合,除了具有更复杂的查询功能” [ Evans, Domain Driven Design ] 并且可以被视为“内存门面中的对象”( 0x212334)1

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

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

A DAO “将数据资源的客户端接口(interface)与其数据访问机制分开/使特定数据资源的访问API适应通用客户端接口(interface)”允许“数据访问机制独立于使用数据的代码而改变”(0x214233481)

存储库看起来非常通用,没有暴露数据库交互的概念。
DAO 提供了一个接口(interface),允许使用不同的底层数据库实现。
TableDataGateway 特别是围绕单个表的薄包装。
DataMapper 充当中介,使 Model 对象能够独立于数据库表示(随着时间的推移)发展。

关于c# - 数据映射器、表数据网关(Gateway)、数据访问对象(DAO)和存储库模式有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/804751/

10-14 17:13
查看更多