Генератор NHibernate ID при использовании NServiceBus

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

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

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

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

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


person Ben Foster    schedule 07.10.2011    source источник
comment
Можете ли вы объяснить немного больше о рабочем процессе? Кажется, что вы хотите отслеживать сеанс. Обычно это делается с помощью сгенерированного клиентом идентификатора и не имеет ничего общего с идентификаторами объектов.   -  person Adam Fyles    schedule 07.10.2011
comment
@AdamFyles это довольно распространенный рабочий процесс в веб-приложении. Имейте какую-то страницу создания, которая сохраняет что-то в базе данных, а затем перенаправляет вас на страницу редактирования для этого элемента.   -  person Ben Foster    schedule 07.10.2011
comment
Я просто почувствовал рабочий процесс. Я бы сгенерировал идентификатор на стороне клиента и выполнил его в дополнение к идентификатору вашего объекта.   -  person Adam Fyles    schedule 11.10.2011


Ответы (1)


Это код, который 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);
    }

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

person Nexus    schedule 10.10.2011