在S#arp Architecture的Entity类中,GetHashCode如何通过缓存哈希码来逃脱

时间:2011-08-31 09:23:19

标签: s#arp-architecture

S#arp架构的Entity基类目前实现了GetHashCode:

public override int GetHashCode()
{
    if (cachedHashcode.HasValue)
        return cachedHashcode.Value;

    if (IsTransient())
    {
        cachedHashcode = base.GetHashCode();
    }
    else
    {
        unchecked
        {
            int hashCode = GetType().GetHashCode();
            cachedHashcode = (hashCode * HASH_MULTIPLIER) ^ Id.GetHashCode();
        }
    }

    return cachedHashcode.Value;
}

我在我的应用程序中使用了一些S#arp架构(但不是整个系统)。

GetHashCode的这个特殊实现似乎在我的一些单元测试中引起了我的问题。原因是哈希码被缓存,因此如果在实体上调用GetHashCode,则在实体被更改之后,原始哈希码会一直返回。

现在也许这是S#arp开发人员想要的行为,但是我也觉得很奇怪。

例如:

[Test]
public void Test() 
{
    var foo = new Foo();

    // Console.WriteLine(foo.GetHashCode());

    Session.Save(foo);

    Session.Flush();
    Session.Clear();

    var reloadedFoo = Session.Load<Foo>(foo.Id);

    Assert.That(reloadedFoo.GetHashCode() == foo.GetHashCode());
}

此测试通过,但在我取消注释第一次调用GetHashCode()后,它失败了。

有人可以解释为什么这不是问题吗?

1 个答案:

答案 0 :(得分:0)

我最好的猜测是它不是问题,因为尖锐的架构使用每个请求模型的会话,因此对Session.Load(foo.Id)的调用将返回相同的Foo实例(如果删除会话。刷新和session.Clear测试应该通过),所以你正在测试的情况没有考虑到SharpArch应用程序。