关于隔离我的nhibernate层的建议,以便我可以将它与EF交换掉

时间:2011-09-18 11:10:42

标签: asp.net-mvc nhibernate castle-windsor

好吧,我的项目设置似乎可以使用一些改进。

我目前有:

1. ASP.NET MVC3 Web project
2. NHibernate project with Repositories/Mappings and some session code.
3. Entities (models used in nhibernate like User.cs)
4. Interfaces (like IUser, IRepository<IUser>, IUserRepository...)
5. Common (UserService, ..)

现在的问题是我的nhibernate模型现在需要实现我不喜欢的IUser,但我被迫这样做,因为我的IRepository是通用的,我可以使用{{1}因为User在另一个项目中,所以我必须创建一个接口并执行IRepository<User>

我永远不需要再使用User了,所以这让我烦恼。

如何在保持分离的同时解决这个问题,以便我可以换掉我的ORM?

2 个答案:

答案 0 :(得分:1)

如果您的实体实现了IUser接口,则必须在实体层中定义Interfaces接口,而不是Repositories层。此外,我可能会将此通用接口层重命名为AbstractRepositoriesCommon或其他内容。如果它包含聚合您的存储库的服务,我也会将Services图层重命名为IRepository<IUser>

所以图片可能是:

  1. ASP.NET MVC3 Web项目
  2. 带有存储库/映射的NHibernate项目和一些会话代码。
  3. 域实体(nhibernate中使用的模型,如User.cs和实现域接口,如IUser)
  4. 存储库(例如IUserRepository,{{1}} ...)
  5. 服务(UserService,..)

答案 1 :(得分:1)

我认为你应该从Domain Driven Design的角度来解决这个问题。域应该是持久的 - 无知的。正确实施DDD repository是关键。存储库接口是特定的,以业务为中心,而不是通用的。存储库实现封装了所有数据访问技术(ORM)。请看一下这个answer和这两篇文章:

您的实体应该是具体类型,而不是接口。虽然您可能永远不需要交换您的ORM(正如Ladislav在评论中所说的那样),您应该将其设计为,就像您需要交换它一样。这种心态将真正帮助你实现持久性的无知。