3

遅延読み込みを構成すると、オブジェクトの比較に関する問題が発生します。各ドメイン エンティティ クラス内のオーバーライドされた Equals メソッドには、次の行が含まれています。

if (obj == null || !obj.GetType().Equals(GetType()))

obj はプロキシ インスタンスであるため、型の比較は明らかに失敗します。オブジェクトのプロキシを解除して実際のインスタンスを返す NHibernate スニペットをいくつか見てきました。しかし、ドメイン駆動型の設計を実施しているため、ドメイン レイヤー内に ORM 固有のコードは必要ありません。また、呼び出し元は ORM 固有のコードを含まないアプリケーション層であるため、呼び出し元側でインスタンスのプロキシを解除することはできません [例: foo.Equals(Unproxy(bar))] (すべての NHibernate 依存関係は Windsor によって注入されます)。

簡単に言うと、実際のインスタンスを取得するための汎用コードはありますか?

4

2 に答える 2

5

それを解決する方法は、キャストを行うことです。

public class Person
{
    public int Id { get; set; }

    public override bool Equals(object obj)
    {
        var person = obj as Person;

        if (person == null)
        {
            return false;
        }

        return person.Id == this.Id;
    }
}

proxyクラスから継承するため、キャストは機能します(例PersonProxy : Person

nullであるか、人物としてキャストできるオブジェクトでないas場合、キャストはnullを返すだけなので、nullチェックは不要です。obj

于 2012-10-16T11:24:52.443 に答える
3

GetTypeUnproxiedまたは、次のようなメソッドを作成することもできます: https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/BaseObject.cs

このメソッドは、プロキシ内にあるオブジェクトの実際の型を返すため、継承マッピングでも機能します。

于 2012-10-16T12:03:20.647 に答える