代码之家  ›  专栏  ›  技术社区  ›  nfplee

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

  •  0
  • nfplee  · 技术社区  · 12 年前

    有没有可能说:

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

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

    我很感激你的帮助。

    1 回复  |  直到 12 年前
        1
  •  0
  •   Neil Hewitt    12 年前

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

    关于连接的子类映射,有一个漫长而混乱的答案,它在某种程度上是有效的,因为它允许您映射一个接口类型,然后映射实现该接口的所有具体类型,这些类型可以持久化,但它并没有真正给到您想要的东西,即将接口属性映射到DB,然后获取/保存任何满足接口的旧实体的能力,具有指定的默认类型。

    你可以写一些包装 ISession 那会让你为所欲为的 wrapper.Get<IUser>(id) session.Get<User>(id) ,但那你基本上就是打平了 IUser 成为的别名 User 这确实违背了最初使用该接口的全部原因。

    (此外:如果你只是出于IoC的目的使用接口,即在“正常”操作中,IUser和具体类型之间会有一对一的映射,例如,出于测试目的,有一个模拟用户,那么你可以做的是将NHibernate封装在一个存储库后面,该存储库知道如何与你的IoC解决方案对话以获得具体类型,然后采取相应的行动隐式转换。我已经这样做了,它很有效,但有点乱。)