可以说:
var user = session.Get<IUser>(1);
其中IUser是一个接口,并且有一个名为User的实现。 User类被映射到Users表,我想在NHibernate中进行Get / Query时使用它作为默认类型。
我很感激帮助。
答案 0 :(得分:0)
简短的回答是否定的。 NHibernate要求您映射并指定具体的类。
有一个冗长而凌乱的答案涉及连接子类映射,这种映射可以实现,因为它允许您映射接口类型,然后实现可以持久保存的所有具体类型,但它不会真的给你你想要的东西,这是能够将界面属性映射到数据库,然后获得/保存任何满足界面的旧实体,具有指定的默认类型。
您可以在ISession
周围编写某种包装,让您按照自己的意愿行事 - 即将wrapper.Get<IUser>(id)
的任何来电转换为session.Get<User>(id)
,但之后您基本上会只是将IUser
绑定为User
的别名,这实际上违背了首先使用界面的全部原因。
(旁白:如果你只是出于IoC的目的使用接口,那么IUser和'正常'操作中的具体类型之间会有一对一的映射,例如,用于测试目的的模拟用户,然后你可以做的是将NHibernate包装在一个存储库后面,它知道如何与你的IoC解决方案交谈以获得具体类型,然后相应地采取行动。由于隐式转换,查询仍然按预期工作。我已经完成了这个并且它有效,但它有点乱。)