Хорошо, так как этот вопрос был опубликован, 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, кстати, но я настойчивый, и не в том смысле, что вы можете спасти меня и отложить на потом.)
person
mindplay.dk
schedule
29.04.2011