2012-10-16 148 views
2

配置了延遲加載後,我遇到了有關對象比較的問題。我的被​​覆蓋的等號方法中的每個域實體類中包含以下行:NHibernate延遲加載和對象比較

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

顯然,作爲obj是一個代理實例的類型的比較將失敗。我已經看到了一些NHibernate片段,它們可以解析一個對象並返回實例。但是,當我執行一個域驅動設計時,我不想在我的域層中使用任何特定於ORM的代碼。 我也不能unproxy在來電方[例如作爲調用者的foo.Equals(Unproxy(bar))]是我的應用程序層,它也不包含任何特定於ORM的代碼(所有NHibernate依賴項都由Windsor注入)。

長話短說:有沒有任何通用的代碼來獲得真實的實例?

+0

爲什麼你想獲得平等比較的類型?你的實體是否有自然的身份進行比較?如果它是一個值對象,你會比較屬性... – MattDavey

+0

那麼,但如果我只比較自然id,我得到了域對象類型A,B和實例A a,B b和a.id = b.id,即使對象完全不同,我的Equals方法也會返回true。例如。一輛id = 1的車和一條狗將被視爲真實。 – mbue

+0

啊,我以爲你在說'IEquatable.Equals' - 我的錯! – MattDavey

回答

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

空檢查是不必要的,因爲as廣播將如果obj不是null或不是可以作爲人員投射的對象,則返回null。

+0

謝謝,沒想到解決方案會變得微不足道:) – mbue

+2

@mbue警告:這對使用繼承映射映射的類不起作用。看到這裏:http://stackoverflow.com/questions/3523686/issue-with-casting-proxies-when-using-nhibernate-table-per-subclass-inheritance – cremor

+0

謝謝@mbue我不使用繼承映射,所以wasn'我知道這一點。 –

3

或者你可以創建一個GetTypeUnproxied方法類似如下所示:https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/BaseObject.cs

此方法將即使有繼承映射工作,因爲它返回的真正類型是代理內部的對象。

+0

老實說我不明白解決方案。 GetTypeUnproxied似乎只是簡單地調用GetType()。這怎麼解決這個問題? – mbue

+1

@mbue如果您在代理上調用GetTypeUnproxied(),它會將該調用轉發給實體上的實際方法。所以如果你在GetTypeUnproxied()方法中,「this」指向真實實體(而不是代理)。因此GetType()然後返回真實實體的類型。 – cremor

+0

好了,現在我明白了。非常優雅的解決方案,謝謝。 – mbue