Генератор идентификаторов NHibernate при использовании NServiceBus - PullRequest
1 голос
/ 07 октября 2011

Для большинства приложений CRUD я использую генератор guid.comb ID от NHibernate. Преимуществом этого является то, что у меня есть доступ к идентификатору до того, как я выполню очистку базы данных, и я обошел проблему фрагментации индекса, связанную с использованием обычных Guids.

Когда мы представляем обмен сообщениями, возникает несколько вопросов:

  1. Поскольку мы отправляем команды для внесения изменений в наш уровень домена, на самом деле у нас нет доступа к «новому» объекту домена в пользовательском интерфейсе. Часто (в случае веб-приложения) нам нужен его идентификатор для перенаправления на другую страницу. Одним из решений было бы передать идентификатор как часть команды (например, Guid.NewGuid ()), но тогда мы потеряем последовательные Guids, которые предоставляет NHibernate.
  2. Если вместо этого мы используем стратегию идентификации, мы устраняем проблему с индексами, но теперь у нас нет простого способа определения идентификатора из пользовательского интерфейса, кроме подписки на событие или синхронного выполнения команды, оба из которых не идеальны в сети. применение.

Так что мне любопытно, какую стратегию используют другие разработчики NServiceBus. Выполнение какой-либо операции над существующим объектом на самом деле не является проблемой, поскольку мы можем просто отправить запрос с помощью ajax для отправки команды и уведомить пользователя, что все прошло успешно (возможно). Поскольку страница, на которой они находятся, уже содержит обновленную информацию, этого достаточно.

Однако, когда мы создаем новый экземпляр объекта домена (с помощью команды), нам часто нужно перенаправить пользователя на страницу, которая затем извлекает вновь созданный объект из нашей базы данных. Конечно, эта сущность еще не сохранена (поскольку мы обрабатываем наши команды асинхронно), и нам обычно требуется Id для выполнения этого перенаправления.

1 Ответ

1 голос
/ 10 октября 2011

Это код, который nhibernate использует для создания расчески.

private Guid Generate()
    {
        byte[] guidArray = Guid.NewGuid().ToByteArray();

        DateTime baseDate = new DateTime(1900, 1, 1);
        DateTime now = DateTime.Now;

        // Get the days and milliseconds which will be used to build the byte string 
        TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
        TimeSpan msecs = now.TimeOfDay;

        // Convert to a byte array 
        // SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333 
        byte[] daysArray = BitConverter.GetBytes(days.Days);
        byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));

        // Reverse the bytes to match SQL Servers ordering 
        Array.Reverse(daysArray);
        Array.Reverse(msecsArray);

        // Copy the bytes into the guid 
        Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
        Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);

        return new Guid(guidArray);
    }

Может быть, вы можете использовать его:)

...