代码之家  ›  专栏  ›  技术社区  ›  Erik van Brakel scottrakes

通过COM互操作生成ID

  •  2
  • Erik van Brakel scottrakes  · 技术社区  · 15 年前

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

    我想知道的是,在不绕过COM程序集的情况下,是否可以使用nhibernate为我们完成一些繁重的工作。下面是按照我的设想将某些内容保存到数据库中的代码:

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

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

    我可以自由使用我想要的任何技术,所以如果它涉及到像IOC容器之类的东西,那就没问题了。我要寻找的是在哪里准确地连接我的代码,这样我就可以访问我的生成器中需要的东西,而不必诉诸于使用单例或其他讨厌的东西。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Diego Mijelshon    15 年前

    假设您想要为所有实体提供COM组件的单个实例,那么就需要一个服务定位器(使用任何IOC容器实现)。

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

    需要考虑的一点是:COM组件线程安全吗?如果没有,则应同步 生成 电话。

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