实现Data Mapper和Repository的单一界面 - 有什么好处?

时间:2012-10-15 19:08:53

标签: design-patterns repository-pattern datamapper

  

Data Mapper是一个Mappers层,可以在对象和对象之间移动数据   数据库,同时保持它们彼此独立和映射器   本身。

     

存储库使用a在域和数据映射层之间进行调解   用于访问域对象的类似集合的接口。

因此, Data Mappers 的主要工作是执行对象表行之间的映射并保留数据库相互独立,而主要工作或存储库是提供更多面向对象的持久层和同时保持域层完全独立于持久层

a)据我所知, Data Mapper Repository 都抽象了持久层,唯一不同的是存储库提供了更多面向对象的持久层视图?

b)在大多数实现中, Repository 位于 Data Mapper 层之上,但在以下实现中(来自“为企业构建网络解决方案”一书) interface 既可以作为 Data Mapper ,也可以作为 Repository (因此它还将持久层作为集合掩盖) :

public interface IDataMapper<T>
{
/* Persistence */
void Create(T item);
void Update(T item);
void Delete(T item);

/* Repository */
IList<T> GetAll();
IList<T> GetAll(int index, int size);
int GetCount();
int GetCount(Query query);
T GetByKey(object key);
IList<T> GetByCriteria(Query query);
IList<T> GetByCriteria(Query query, int index, int size);
string TranslateQuery(Query query);
}

Repository 位于数据映射器层之上的设计相比,此类设计有哪些优点/缺点?

谢谢

2 个答案:

答案 0 :(得分:3)

该代码违反了接口隔离原则,该原则基本上表示您应该创建较小的明确定义的接口,而不是具有许多功能的较大接口。

这个动力解释得很好:

enter image description here

而不是一个简单的USB接口,你可以获得很多先进的东西(这很难实现)。

为什么你应该保持接口小的原因是接口强制每个实现者实现所有方法(除非他们想要违反Liskovs替换原则)。

因此将其分解,而让该类实现两个接口。

答案 1 :(得分:1)

我同意@jgauffin,他说接口应该是隔离的。但是,如果您确定没有将接口导出到外部模块/应用程序(虽然接口更可能被其他人使用......这就是它们是接口的原因),您也确信没有其他人是要实现它,它只是你自己的代码,甚至你的代码也不希望将mapper与存储库分开,你可以权衡并将它们组合在一起。它可能导致更紧凑的代码......并且可能更紧密或强制耦合。如果这些在某些情况下可能是有利的,那么这可能就是建筑书籍的作者那样做的原因。

然而,我相信,最好的方法是按照@jgauffin的建议分离接口。您无法确定接口的客户端以及将来可能需要的扩展。分离接口将产生更易维护和可扩展的代码。