さて、この質問が投稿されてから、NHibernate 3 がリリースされました。
これを手放すわけにはいきません。null-object パターンを使用したいのですが、「できない」では満足できないので、これを実現する方法を考えてみましょう。
Web 上のいくつかの投稿やメモで見つけた 1 つのアイデアは、パブリック (マップされていない) アクセスを持つものとプライベート (マップされた) アクセスを持つものという 2 つのプロパティを使用することです。return MyPrivate ?? MyType.NullObject
...クエリインターフェイスに問題が発生するため、その考えを排除しました-パブリックプロパティはマップされていないため、クエリを実行できません。したがって、そのアプローチを忘れることができます。
私には、どこにも探求されていない 2 つのアイデアがあります。
インターセプターを使用して、読み取り/書き込みの前後にプロパティ値を変更します。
インターセプターは機能しないと誰かが言いましたが、我慢してください...疑似コードで:
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;
}
}
つまり、ロード時に null を null オブジェクトに置き換えます。保存する前に null オブジェクトを実際の null 値に置き換え、保存後に null オブジェクトに置き換えます。
もちろん、クエリ API を使用する場合、実際の null 値をクエリする必要がありますが、クエリ API に何らかの基準ビルダーまたはファクトリ クラスがある場合は、そこで説明できます。
型を専用の null オブジェクト型に拡張し、非永続化します。何とかして。
ちょっと考えてみてください。型を専用の null オブジェクト型に拡張するとします。次のようなもの:
class Bar
{
public static NullBar; // instace of NullBar
}
class NullBar : Bar
{
// ...
}
NullBar は Bar を拡張する専用の型なので、Nullar 型をマップしないように NHibernate に伝えることはできますか?
以上が私の考えです。
(ところで、私は NHibernate 初心者ですが、しつこいので、あなたが私を救って後で取っておいてくれるという意味ではありません。)