【问题标题】:Generate an ID via COM interop通过 COM 互操作生成 ID
【发布时间】:2011-02-21 06:39:45
【问题描述】:

目前,我们有一个无法维护的代码球,它提供了第三方应用程序的接口。第三方应用程序有一个必须用于创建新条目的 COM 程序集。此过程包括两个步骤:生成一个新对象(基本上是一个 ID),并使用新的字段值更新该对象。
因为 COM 互操作非常慢,我们只使用它在数据库中生成 ID(和相关对象)。实际更新是使用常规 SQL 查询完成的。

我想弄清楚是否可以使用 NHibernate 为我们完成一些繁重的工作,而无需绕过 COM 程序集。这是我设想的将某些内容保存到数据库的代码:

using(var s = sessionFactory.OpenSession())
using(var t = s.BeginTransaction())
{
    MyEntity entity = new MyEntity();
    s.Save(entity);
    t.Commit();
}

我会说常规 NH 代码。现在,这就是棘手的地方。我认为我必须提供自己的 NHibernate.Id.IIdentifierGenerator 实现,它在 Generate 方法中调用 COM 程序集。这不是问题。问题是 COM 程序集需要初始化,这确实需要一些时间。出于某种原因,它也不喜欢同一进程中的多个实例。
我想知道的是是否有办法在生成器代码中正确访问外部服务。

我可以随意使用任何我想要的技术,所以如果它涉及到诸如 IoC 容器之类的东西,那也没问题。我正在寻找的是在哪里连接我的代码,这样我就可以在我的生成器中访问我需要的东西,而不必求助于使用单例或其他讨厌的东西。

【问题讨论】:

    标签: nhibernate com generator


    【解决方案1】:

    假设您想要所有实体的 COM 组件的单个实例,则可以使用服务定位器(使用任何 IoC 容器实现)。

    您的(微不足道的)IIdentifierGenerator 实现必须在其构造函数中调用定位器以获取组件实例,并在 Generate 上调用组件上的相应方法。

    需要考虑的一点:COM 组件是线程安全的吗?如果没有,您应该同步Generate 调用。

    生成器的使用很简单,只需使用完全限定名称作为生成器类即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 2017-04-28
      • 2015-06-29
      • 1970-01-01
      • 2012-04-30
      • 2012-06-09
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多