2012-10-16 36 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