2

ドメインでNullObjectパターンを利用したいのですが、それに関連するレコードをデータベースに入れたくありません。NHibernateがSQLnull値をNullオブジェクトにマップできればそれを好みます。 、 およびその逆。

これは可能ですか(マッピングにFluent NHibernateを使用)

PSこれは、人々が解決しようとしているかなり一般的な問題のようですが、なぜ私は答えを見つけるのに苦労したのだろうかと思います。

編集: このブログエントリから判断すると、直接可能になるとは思えません:NHibernate&Nullオブジェクトパターン:オプション

4

3 に答える 3

1

流暢ではないnhibernateでは、このようにデータベースに永続化されないインポートマッピングを使用できます。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
      namespace="MyProject.MiddleTier"    
      assembly="MyProject.MiddleTier">
   <import class="ThingNotToPersist"/>
</hibernate-mapping>

これが流暢にどのように機能するかはわかりませんが、うまくいけば、それはあなたにスターターを与えるでしょう。

于 2009-07-03T08:26:04.447 に答える
1

答えは...できません。Oren は次のように述べています。「NHibernate の null の概念は簡単に変更できるものではなく、インターセプターを介して変更することもありません。(UserType を使用して) 値型に null オブジェクトを使用できますが、エンティティには使用できません。」

于 2009-07-30T08:10:46.080 に答える
0

さて、この質問が投稿されてから、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 初心者ですが、しつこいので、あなたが私を救って後で取っておいてくれるという意味ではありません。)

于 2011-04-29T16:58:16.723 に答える