2010-05-19 57 views
2

目前,我們已經得到了一個無可挑剔的代碼球,它爲第三方應用程序提供了一個接口。第三方應用程序有一個COM程序集,其中必須用於創建新條目。這個過程涉及兩個步驟:生成一個新對象(基本上是一個ID),並用新的字段值更新該對象。
由於COM互操作性太慢,我們只使用它來在數據庫中生成ID(和相關對象)。實際更新是使用常規SQL查詢完成的。通過COM互操作生成一個ID

我想知道是否有可能使用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它在生成方法中調用COM程序集。這不是問題。什麼是問題是COM程序集需要初始化,這需要一些時間。由於某種原因,它也不喜歡同一個進程中的多個實例。
我想知道的是,如果有一種方法可以正確訪問發生器代碼中的外部服務。

我可以自由使用任何我想要的技術,所以如果它涉及像IoC容器這樣的東西沒有問題。我正在尋找的東西恰恰是連接我的代碼的地方,所以我可以在我的生成器中訪問我需要的東西,而不必訴諸使用單例或其他討厭的東西。

回答

0

假設您希望所有實體都使用COM組件的單個實例,那麼服務定位器(使用任何IoC容器實現)就是您的選擇。

您的(微不足道)IIdentifierGenerator實現將不得不在其構造函數中調用該定位器以獲取該組件實例,並在組件上調用相應的方法Generate

需要考慮的一件事是:COM組件是否是線程安全的?如果不是,您應該同步Generate調用。

生成器的使用很簡單,只需使用完全限定的名稱作爲生成器類。