我正在努力复习我的设计模式技能,我很好奇这些模式之间有什么不同?它们看起来都是一样的--封装特定实体的数据库逻辑,这样调用代码就不知道底层的持久层了。根据我的简短研究,它们都实现了标准的CRUD方法,并抽象出特定于数据库的细节。
除了命名约定(例如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);
对于数据映射器和存储库模式,这似乎是相同的原则;DAO模式(我认为它与Gateway是同一件事?)似乎也鼓励使用特定于数据库的网关。
我是不是遗漏了什么?有3-4种不同的方式来做同样的事情,这似乎有点奇怪。
发布于 2009-05-02 08:41:33
在软件设计界有一种趋势(至少,我是这样认为的),为众所周知的旧事物和模式创造新的名称。当我们有了一个新的范例(它可能与现有的东西略有不同),它通常会为每一层带来一整套新的名称。因此,“业务逻辑”变成了“服务层”,因为我们说我们做了SOA,DAO变成了存储库,因为我们说我们做了DDD (这些实际上都不是什么新的和独特的东西,但是再说一遍:同一本书中收集的已知概念的新名称)。因此,我并不是说所有这些现代范式和缩略语的含义完全相同,但您真的不应该对此过于偏执。大多数情况下,这些是相同的模式,只是来自不同的家族。
发布于 2009-04-30 00:03:33
你说得很对。选一个你最熟悉的。我想指出一些可能有助于澄清的事情。
表数据网关主要用于单个表或视图。它包含所有selects、inserts、updates和deletes。因此,在您的示例中,Customer是一个表或视图。因此,表数据网关对象的一个实例处理表中的所有行。通常这与每个数据库表中的一个对象相关。
而Data Mapper更独立于任何域逻辑,耦合性更低(尽管我认为存在耦合或不耦合)。它只是一个中间层,用于在对象和数据库之间传输数据,同时保持它们彼此以及映射器本身的独立性。
因此,通常在映射器中,您会看到插入、更新、删除等方法,而在表数据网关中,您会发现getcustomerbyId、getcustomerbyName等。
数据传输对象不同于上述两种模式,主要是因为它是一种分布式模式,而不是上述两种模式中的数据源模式。主要在使用远程接口时使用它,并且需要减少调用的闲聊,因为每次调用都会变得很昂贵。因此,通常设计一个DTO,它可以通过网络进行序列化,可以将所有数据传回服务器,以便进一步应用业务规则或进行处理。
我不太精通存储库模式,因为到目前为止我还没有机会使用,但我会看看其他人的答案。
https://stackoverflow.com/questions/804751
复制相似问题