好的,既然发布了这个问题,NHibernate 3 就发布了——也许现在有什么可能?
我不愿意放手——我想使用空对象模式,而且我不会满足于“你不能”,所以让我们想办法实现这一点!
我在网络上的几篇文章和笔记中遇到的一个想法是使用两个属性 - 一个具有公共(未映射)访问权限,一个具有私有(映射)访问权限 - 因此公共属性的 get-accessor 将像return MyPrivate ?? MyType.NullObject 这样的东西......我已经消除了这个想法,因为它会在查询界面上产生问题——你不能查询公共属性,因为它没有被映射。所以我们可以忘记这种方法。
我有两个从未见过的想法:
使用拦截器在读/写之前/之后更改属性值。
有人提到拦截器不起作用,但请耐心等待......在伪代码中:
class Foo
{
public Bar Bar { get; set; }
}
class Bar
{
public static Bar None;
}
class MyInterceptor
{
public void AfterLoad(IEntity object)
{
foreach (property in object)
if (property.type == typeof(Bar) && property.value == null)
object[property].value = Bar.None;
}
public void BeforeSave(IEntity object)
{
foreach (property in object)
if (property.type == typeof(Bar) && property.value == Bar.None)
object[property].value = null;
}
public void AfterSave(IEntity object)
{
foreach (property in object)
if (property.type == typeof(Bar) && property.value == null)
object[property].value = Bar.None;
}
}
简而言之,在加载时用空对象替换空值;保存前,用实际的空值替换空对象,保存后,将空对象替换回去。
当使用查询 API 时,您当然需要查询实际的空值,但如果您在查询 API 上有某种标准生成器或工厂类,则可以在那里考虑。
将您的类型扩展为专用的空对象类型并使其非持久化。不知何故。
只是一个想法-假设您要将类型扩展为专用的空对象类型。大致如下:
class Bar
{
public static NullBar; // instace of NullBar
}
class NullBar : Bar
{
// ...
}
既然 NullBar 是扩展 Bar 的专用类型,我们能否以某种方式告诉 NHibernate 不要映射 Nullar 类型,即使它扩展了已映射的 Bar?
这些是我的想法——其中任何一个听起来都合理吗?
(顺便说一句,我是一个 NHibernate 菜鸟——但我很坚持,并不是说你可以救我,然后把我放在一边。)