Nhibernate 通过COM互操作生成ID

Nhibernate 通过COM互操作生成ID,nhibernate,com,generator,Nhibernate,Com,Generator,目前,我们有一个无法维护的代码球,它为第三方应用程序提供了一个接口。第三方应用程序有一个COM程序集,必须用于创建新条目。此过程包括两个步骤:生成一个新对象(基本上是一个ID),并使用新字段值更新该对象。 因为COM互操作非常慢,所以我们只使用它在数据库中生成ID(和相关对象)。实际更新是使用常规SQL查询完成的 我想弄清楚的是,是否可以使用NHibernate为我们完成一些繁重的工作,而不必绕过COM组件。下面是按照我的设想将某些内容保存到数据库的代码: using(var s = sessi

目前,我们有一个无法维护的代码球,它为第三方应用程序提供了一个接口。第三方应用程序有一个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容器这样的东西,那也没问题。我要找的是在哪里连接我的代码,这样我就可以访问我的生成器中需要的东西,而不必使用单例或其他讨厌的东西。

假设您希望所有实体都有一个COM组件实例,那么一个服务定位器(使用任何IoC容器实现)就是最好的选择

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

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


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

假设您希望所有实体都有一个COM组件实例,那么就可以使用服务定位器(使用任何IoC容器实现)

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

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

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