3

配置了延迟加载后,我遇到了关于对象比较的问题。我在每个域实体类中重写的 Equals 方法包含以下行:

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

显然,类型比较将失败,因为 obj 是代理实例。我已经看到了一些 NHibernate 片段,它们取消代理对象并返回真实实例。但是当我强制执行域驱动设计时,我不希望在我的域层中有任何特定于 ORM 的代码。我也无法取消代理调用方的实例 [例如 foo.Equals(Unproxy(bar))],因为调用方是我的应用程序层,它也不包含任何 ORM 特定的代码(所有 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 检查是不必要的,因为如果为 null 或不是可以转换为人的对象,则as转换只会返回 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 回答