目前,我们已经获得了一个无法解决的代码球,它提供了第三方应用程序的界面。第三方应用程序有一个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容器那样没问题。我正在寻找的是确切地连接我的代码,以便我可以在生成器中访问我需要的东西,而不必诉诸于使用单身或其他讨厌的东西。
答案 0 :(得分:0)
假设您想为所有实体提供COM组件的单个实例,那么就可以使用服务定位器(使用任何IoC容器实现)。
您的(普通)IIdentifierGenerator
实现必须在其构造函数中调用定位器来获取组件实例,并在Generate
上的组件上调用相应的方法。
要考虑的一件事是:COM组件是线程安全的吗?如果没有,您应该同步Generate
来电。
生成器的使用很简单,只需使用完全限定名称作为生成器类。