在NHibernate中将接口映射到默认类型

时间:2012-09-12 08:11:05

标签: nhibernate interface nhibernate-mapping

可以说:

var user = session.Get<IUser>(1);

其中IUser是一个接口,并且有一个名为User的实现。 User类被映射到Users表,我想在NHibernate中进行Get / Query时使用它作为默认类型。

我很感激帮助。

1 个答案:

答案 0 :(得分:0)

简短的回答是否定的。 NHibernate要求您映射并指定具体的类。

有一个冗长而凌乱的答案涉及连接子类映射,这种映射可以实现,因为它允许您映射接口类型,然后实现可以持久保存的所有具体类型,但它不会真的给你你想要的东西,这是能够将界面属性映射到数据库,然后获得/保存任何满足界面的旧实体,具有指定的默认类型。

您可以在ISession周围编写某种包装,让您按照自己的意愿行事 - 即将wrapper.Get<IUser>(id)的任何来电转换为session.Get<User>(id),但之后您基本上会只是将IUser绑定为User的别名,这实际上违背了首先使用界面的全部原因。

(旁白:如果你只是出于IoC的目的使用接口,那么IUser和'正常'操作中的具体类型之间会有一对一的映射,例如,用于测试目的的模拟用户,然后你可以做的是将NHibernate包装在一个存储库后面,它知道如何与你的IoC解决方案交谈以获得具体类型,然后相应地采取行动。由于隐式转换,查询仍然按预期工作。我已经完成了这个并且它有效,但它有点乱。)