0

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

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

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

a) 据我所知,Data MapperRepository都抽象了持久层,唯一的区别是Repository提供了更多的持久层的面向对象视图?

b) 在大多数实现中, Repository位于Data Mapper层之上,但在以下实现中(来自《Architecting Net Solutions for the Enterprise》一书),相同的接口同时作为Data MapperRepository发挥作用(因此它也掩盖了持久性层作为一个集合):

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位于数据映射器层之上的设计相比,这种设计的优点/缺点是什么?

谢谢你

4

2 回答 2

3

该代码违反了接口隔离原则,该原则基本上说您应该创建更小的定义良好的接口,而不是创建具有许多功能的更大接口。

这个动机很好地解释了它:

在此处输入图像描述
(来源:losechies.com

而不是一个简单的 USB 接口,你会得到一个带有许多高级东西的顶级盒子(这很难实现)。

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

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

于 2012-10-16T05:41:15.417 回答
1

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

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

于 2012-10-16T06:02:31.867 回答