如何在n层架构中解决这个NHibernate查询?

时间:2012-10-15 20:33:46

标签: c# nhibernate onion-architecture

我试图将NHibernate从我的服务层分离出来。我的架构看起来像这样:

  

网络 - >服务 - >存储库 - > nhibernate - >分贝

我希望能够从我的服务层以及可能是我的网络层生成nhibernate查询,而不知道这些层知道他们正在处理什么样的orm。目前,我在我的所有存储库中都有一个查找方法,它接收IList<object[]> criteria。这允许我从我的架构中的任何位置传递一个标准列表,例如new object() {"Username", usernameVariable};。 NHibernate接受它并创建一个新的Criteria对象并添加传入的标准。这适用于我的服务层的基本搜索,但我希望能够传入我的存储库转换为NHibernate Criteria的查询对象。

真的,我很乐意实现这个问题所描述的内容:Is there value in abstracting nhibernate criterion。我只是没有找到任何关于如何实现这样的东西的好资源。该问题中描述的方法是一种好方法吗?如果是这样,有人可以提供一些关于如何实施这种解决方案的指示吗?

2 个答案:

答案 0 :(得分:9)

抽象出ORM将:

  • 带来了很多重新定义API的工作
  • 无法优化/批量访问数据库
  • 让我们更难理解执行哪些查询
  • 将导致大量的SELECT N + 1

并且价值非常低:交换ORM框架的模糊选项很可能会有很多其他问题

  • 缺少功能
  • 实施中的细微差别
  • 学习曲线

更新:体验

我曾经参与实现现有DAL抽象的新提供程序。它最终表现不佳,引入了很多错误,错误处理是一团糟,有时使用陈旧数据,因为应用程序采用了默认实现。原因:

  • 缓存不知道上下文
  • Cacheimlementation具有不同的语义
  • 批处理API太不同而不能被抽象
  • 错误特定于实现(例如 FileNotFound - &gt; FilesearchDialog 对于基于tcp / ip的数据库无用)
  • 错误恢复不同(每个实现都有自己可以从中恢复的错误集)
  • 锁定机制不同
  • SQL-Databases中没有一致的更改事件
  • 嵌套交易
  • 模型类中的默认实现已消失
  • 重新实现所有抽象的Queryies是很多工作并且引入了很多复制粘贴错误
  • 在没有明确说明订单的情况下查询将在不同的实现中返回不同的有序结果

需要对应用程序进行大量重构:

  • 剥离功能只提供一个实现
  • 每个实施的缓存管理
  • 由于瞬态数据导致的包装器身份问题
  • 非常难以实现对两个数据存储区的查询

补充要点:

  • 通过抽象DAL迁移数据的速度很慢
  • 实施又一个实施将永远不会发生,因为上述问题太昂贵了(在上述情景中我们开始慢慢重新实现整个项目)
  • 实现DAL API的正确语义极其困难,因为纯API中没有使用上下文

移植(业务任务)对IMO的影响要小得多,因为我们因为性能而为少数人做了这样的事情。

Update2:experience2:尝试从NHibernate移植到EntityFramework时使用RoadBlocks(使用NH进行移植,但在合理的时间内无法使用EF 4)

  • 嵌套交易
  • Enum支持
  • 使用compositeId引用(如何摆脱referenceIds)
  • 组件
  • 中的引用
  • 阅读批量(期货),方便页面+计数一次性
  • 映射CultureInfo(IUserType支持)

答案 1 :(得分:0)

感谢您的回复!我明白你在说什么,但这些答案并没有解决我的问题。由于我正在写的系统的状态,我无法改变我的架构。相反,我只是将所有sql / hql / criteria api查询保留在存储库层内,而不是尝试向我的服务公开某种复杂的查询类。这种方法应该可以正常工作。不过,对于我的下一个架构方法,我会考虑其他答案中的要点。