gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:33:01 24 4
gpt4 key购买 nike

我正在努力温习我的设计模式技能,我很好奇这些模式之间有什么区别?它们看起来都像是同一件事——封装特定实体的数据库逻辑,因此调用代码不知道底层持久层。根据我的简短研究,它们通常都实现您的标准 CRUD 方法并抽象出特定于数据库的详细信息。

除了命名约定(例如 CustomerMapper vs. CustomerDAO vs. CustomerGateway vs. 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);

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

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

最佳答案

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

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

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

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

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

Repository 看起来非常通用,没有公开任何数据库交互的概念。DAO 提供了一个接口(interface),允许使用不同的底层数据库实现。TableDataGateway 专门是单个表的薄包装器。DataMapper 充当中介,使模型对象能够独立于数据库表示(随着时间的推移)发展。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com