好吧,我的项目设置似乎可以使用一些改进。
我目前有:
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?
答案 0 :(得分:1)
如果您的实体实现了IUser
接口,则必须在实体层中定义Interfaces
接口,而不是Repositories
层。此外,我可能会将此通用接口层重命名为AbstractRepositories
或Common
或其他内容。如果它包含聚合您的存储库的服务,我也会将Services
图层重命名为IRepository<IUser>
。
所以图片可能是:
IUserRepository
,{{1}} ...)答案 1 :(得分:1)
我认为你应该从Domain Driven Design的角度来解决这个问题。域应该是持久的 - 无知的。正确实施DDD repository是关键。存储库接口是特定的,以业务为中心,而不是通用的。存储库实现封装了所有数据访问技术(ORM)。请看一下这个answer和这两篇文章:
您的实体应该是具体类型,而不是接口。虽然您可能永远不需要交换您的ORM(正如Ladislav在评论中所说的那样),您应该将其设计为,就像您需要交换它一样。这种心态将真正帮助你实现持久性的无知。