【问题标题】:NHibernate ID generator when using NServiceBus使用 NServiceBus 时的 NHibernate ID 生成器
【发布时间】:2011-10-07 14:07:19
【问题描述】:

对于大多数 CRUD 应用程序,我使用 NHibernate 的 guid.comb ID 生成器。这样做的好处是我可以在刷新到数据库之前访问 ID,并解决与使用普通 Guid 相关的索引碎片问题。

当我们引入消息传递时,会引发一些问题:

  1. 由于我们发送命令来更改我们的域层,我们实际上无法访问 UI 中的“新”域对象。通常(在 Web 应用程序的情况下)我们需要它的标识符来重定向到另一个页面。一种解决方案是将 id 作为命令的一部分传递(例如 Guid.NewGuid()),但随后我们会丢失 NHibernate 提供的顺序 Guid。
  2. 如果我们改为使用身份策略,我们会消除索引问题,但现在除了订阅事件或同步执行命令外,没有简单的方法可以从 UI 确定 id,这两种方法在 Web 中都不理想申请。

所以我很好奇其他 NServiceBus 开发人员正在采取什么策略。对现有实体执行一些操作并不是真正的问题,因为我们可以使用 ajax 发送请求来调度命令,并通知用户一切都成功(可能)。由于他们所在的页面已经有更新的信息,这就足够了。

但是,当我们(通过命令)创建域对象的新实例时,我们经常需要将用户重定向到一个页面,然后从我们的数据库中检索新创建的实体。当然,这个实体可能还没有被保存(因为我们正在异步处理我们的命令),我们通常需要一个 Id 来执行这个重定向。

【问题讨论】:

  • 您能详细解释一下工作流程吗?好像您正在寻找跟踪“会话”。通常这是通过客户端生成的 ID 完成的,与实体 ID 无关。
  • @AdamFyles 这是 Web 应用程序上相当常见的工作流程。有某种“创建”页面,可以将某些内容保存到数据库中,然后将您重定向到该项目的“编辑”页面。
  • 我只是对工作流程有所了解。除了您的实体 id 之外,我会在客户端生成一个 id 并通过它。

标签: nhibernate nservicebus


【解决方案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);
    }

也许你可以使用它:)

【讨论】:

    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多