配置了延迟加载后,我遇到了有关对象比较的问题。我在每个域实体类中的重写Equals方法包含以下行:
if (obj == null || !obj.GetType().Equals(GetType()))
显然,类型比较将失败,因为obj是一个代理实例。我已经看过一些NHibernate-snippets,它们解开一个对象并返回真实实例。但是当我强制执行域驱动设计时,我不希望在我的域层中使用任何特定于ORM的代码。 我也无法在调用者方面解除实例[例如foo.Equals(Unproxy(bar))]作为调用者是我的应用程序层,它也不包含任何特定于ORM的代码(所有NHibernate依赖项都由Windsor注入)。
长话短说:是否有任何通用代码来获取真实实例?
答案 0 :(得分: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。
答案 1 :(得分:3)
或者,您可以创建一个GetTypeUnproxied
方法,如下所示:https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/BaseObject.cs
此方法甚至可以使用继承映射,因为它返回代理内部对象的实际类型。