В классе Entity архитектуры S # arp, как GetHashCode может избежать кэширования хеш-кода - PullRequest
0 голосов
/ 31 августа 2011

S # arp Базовый класс Entity Architecture в настоящее время реализует 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 голосов
/ 01 сентября 2011

Мое лучшее предположение состоит в том, что это не проблема, потому что точная архитектура использует модель сеанса для каждого запроса, поэтому вызов Session.Load (foo.Id) вернул бы тот же экземпляр Foo (если вы удалите сеанс.Очистка и сессия. Ясно, что тест должен пройти), поэтому случай, для которого вы тестируете, не был принят во внимание для приложения SharpArch.

...