- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
就我一直在研究存储库模式而言,“存储库”应该负责数据持久化和基本查询任务,而且仅此而已。所以在一个典型的存储库中,我看到这样的东西:
public interface IProductRepository {
Product GetByID(int id);
void Add(Product item);
void Update(Product item);
void Delete(Product item);
}
但我想知道如果使用像 DevExpress 的 XPO 这样的 ORM 工具,存储库实现将主要由单行方法组成。在 XPO 之外仍然创建这个抽象级别是否有意义?
可以指出模拟和单元测试功能,但例如 XPO 提供了强大的内存持久化功能,这在 99% 的情况下非常适合单元测试。
我想我也可以提到 EF 或 NHibernate,它们具有相似的功能。
另一个问题:如果 - 让我们说 - 我不以这种方式实现存储库模式,我应该在哪里放置更复杂的查询(例如基于复杂的条件或用户角色)或更复杂的项目保存逻辑(与日志记录、验证等)?
感谢您的帮助。
更新
如何定义一个通用的存储库接口(interface),它可以像这样独立地处理 CRUD 操作:
public interface IRepository : IDisposable {
T GetByID<T>(int id);
IQueryable<T> Query<T>();
T Create<T>();
void Update<T>(T item);
void Delete<T>(T item);
}
然后我可以使用 XPO、EF 或我选择的任何 ORM 轻松实现它,甚至使用 JSON 文本文件。这是一个很好的中间解决方案,还是有味道?我能看到的唯一缺点是我应该把上面提到的那些更复杂的操作放在哪里,但可能我可以在需要时从中继承特殊接口(interface)。
最佳答案
But I wonder what if one uses an ORM tool like DevExpress' XPO, a repository implementation would mostly consist of one-liner methods. Does it make sense to still create this abstraction level beside XPO?
在持久化和读取您的域对象时,它取决于编写特定于技术的无知域。
您可能认为 XPO 或任何其他 OR/M 做了很多包装和抽象,所以存储库模式听起来很愚蠢,因为它是一个不必要的层。
好吧,我想说的是,当您决定使用 存储库模式 时,最重要的一点就是让您的域变得不可知,不知道它是如何转化为底层商店所理解的内容的。 OR/M 添加了很多细节和依赖项,如果您将它们分布在您的域代码中,这些细节和依赖项可能几乎不会改变。
您是否意识到存储库模式可能是根据简单的配置开关(控制反转)来决定什么持久化您的数据的正确工具?我不考虑这个用于测试目的:选择存储库模式,因为你想定义你的域如何在一个点上与数据对话。
您甚至可以让您的代码使用同一 OR/M 技术的多个版本,因为较新的版本可能不符合旧的要求,但新的域操作仍然能够实例化一个新的存储库版本,它利用了更新版本的优化和功能!
是的,即使您的存储库具有单行方法,它们仍然有用。为 future 而战!
What about defining a generic repository interface which type-independently addresses CRUD operetaions like this:
这是完全正确的:它被称为通用存储库。事实上,在我自己的开发中,我一直在使用这种模式。
关于c# - 将存储库模式与(例如)DevExpress XPO 一起使用是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24895442/
有没有一个工具可以将一个xpo文件分割成多个xpo文件?与CombineXPOs 的做法完全相反。 我问的原因是因为我需要将多个单个 xpo/models 版本放入源代码管理中,并且我想避免每次都必须
我在我的开发中修改了标签。环境以及其他代码更改,但是当我导出此 XPO 然后将其导入另一个环境时,目标 AOT 中的标签未更新。 如果我用记事本打开XPO,确实可以看到新修改的标签。但是在导入时,对话
我一直在尝试使用 C# 和 DevExpress,遇到了一种我找不到简单解决方案的情况。 我有三个对象: 书 作者 系列 A Book收藏了 Author s(多对多) 安 Author收藏了 Boo
我设置构建已经有一段时间了。为此,我使用 Microsoft 为 AX 2012 提供的脚本 (Build and deploy scripts for Microsoft Dynamics AX 2
有没有人有在复制数据库的环境中使用 DevExpress 的 XPO 的经验?来自我的 previous question这里和一个关于 serverfault 的问题,我认为已经决定复制是要走的路。
就我一直在研究存储库模式而言,“存储库”应该负责数据持久化和基本查询任务,而且仅此而已。所以在一个典型的存储库中,我看到这样的东西: public interface IProductReposito
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是 DevExpress XPO 库的长期用户。它有很多很棒的功能,但也有一些弱点: 保存现有对象时,所有属性都在更新查询中发送;更改是基于每个对象而不是每个属性进行跟踪的。 乐观锁定是在每个对象的
我有这样的情况,我们有一个生产 Dynamics 2009 AX (RTM) 环境,我们使用它的 AOT 执行到 RU8 的代码更新项目。 现在,我有一个生产环境 (RTM) 和一个相同但已修补到 R
我想在 Azure Devops 中为 XAP Mobile 应用程序设置持续集成和部署。 为了获得 CI/CD,我需要设置 Azure Pipeline 以安装正确的包。 Hosting your
使用 ORM(DevExpress XPO、NHibernate 或 MS Entity Framework)升级数据库的最佳实践是什么? 我正在开始一个新项目,必须选择一个 ORM。开发过程需要经常
我在访问具有大量记录的关联属性时遇到速度问题。 我有一个 XAF 应用程序,其父类名为 MyParent。 MyParent 中有 230 条记录。 MyParent 有一个名为 MyChild 的子
我是一名优秀的程序员,十分优秀!