是否可以说:
var user = session.Get<IUser>(1);
其中 IUser 是一个接口,并且有一个称为 User 的实现。User 类映射到 Users 表,我想在 NHibernate 中执行 Get/Query 时将其用作默认类型。
我会很感激帮助。
是否可以说:
var user = session.Get<IUser>(1);
其中 IUser 是一个接口,并且有一个称为 User 的实现。User 类映射到 Users 表,我想在 NHibernate 中执行 Get/Query 时将其用作默认类型。
我会很感激帮助。
最简洁的答案是不。NHibernate 要求您映射和指定具体的类。
有一个冗长而混乱的答案涉及加入子类映射,它有点工作,因为它允许您映射接口类型,然后实现可以持久化的接口的所有具体类型,但它并没有真正给你您似乎想要的是将接口属性映射到数据库的能力,然后使用指定的默认类型获取/保存满足接口的任何旧实体。
你可以编写某种包装器ISession
,让你做你想做的事 - 即,翻译任何对wrapper.Get<IUser>(id)
to 的调用session.Get<User>(id)
,但是你基本上只是把IUser
它当作一个别名,User
这真的违背了使用接口的全部原因首先。
(除此之外:如果您仅出于 IoC 目的使用接口,即 IUser 和“正常”操作中的具体类型之间将存在一对一的映射,例如用于测试目的的模拟用户,那么您可以做的是将 NHibernate 包装在一个存储库后面,该存储库知道如何与您的 IoC 解决方案对话以获取具体类型,然后采取相应的行动。由于隐式转换,查询仍然按预期工作。我已经完成了它并且它有效,但它是一个有点乱。)