2010-05-19 3 views
2

현재로서는 타사 응용 프로그램에 대한 인터페이스를 제공하는 명백한 코드 공이 있습니다. 타사 응용 프로그램에는 이어야하며 새 항목을 만드는 데을 사용해야하는 COM 어셈블리가 있습니다. 이 프로세스에는 두 단계가 포함됩니다. 새 객체 (기본적으로 ID)를 생성하고 새 객체 값으로 객체를 업데이트합니다.
COM 상호 운용성이 너무 느리기 때문에 데이터베이스에서 ID (및 관련 개체)를 생성하는 데만 사용합니다. 실제 업데이트는 일반 SQL 쿼리를 사용하여 수행됩니다.COM interop을 통해 ID 생성

COM 어셈블리를 바이 패스하지 않고 NHibernate를 사용하여 무거운 짐을 처리 할 수 ​​있는지 알아 내려고합니다. 데이터베이스 상에 뭔가를 저장하는 코드는 다음과 같습니다.

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

보통 NH 코드입니다. 자, 이것이 까다로워지는 곳입니다. 내가 생각자신의 구현을 제공해야합니다 Generate 메서드에서 COM 어셈블리를 호출하는 NHibernate.Id.IIdentifierGenerator. 그건 문제가되지 않습니다. 문제는 COM 어셈블리가 약간의 시간이 걸리는 초기화가 필요하다는 것입니다. 또한 어떤 이유로 동일한 프로세스의 여러 인스턴스가 마음에 들지 않습니다.
내가 알고 싶은 것은 발전기 코드에서 외부 서비스에 제대로 액세스하는 방법이 있는지입니다.

내가 원하는 모든 기술을 자유롭게 사용할 수 있으므로 문제가없는 IoC 컨테이너와 관련됩니다. 내가 찾고있는 건 내 코드에 정확히 연결하여 싱글 톤이나 다른 불쾌한 물건을 사용하지 않고도 제네레이터에서 필요한 것을 액세스 할 수 있도록하는 것입니다.

답변

0

모든 엔티티에 대해 COM 구성 요소의 단일 인스턴스를 원한다고 가정하면 모든 IoC 컨테이너로 구현 된 서비스 로케이터가 필요합니다.

당신의 (단순한) IIdentifierGenerator 구현은 구성 자 인스턴스를 얻기 위해 생성자에서 위치 지정자를 호출하고 구성 요소의 해당 메소드를 Generate에 호출해야합니다.

고려해야 할 사항 : COM 구성 요소는 스레드로부터 안전합니까? 그렇지 않은 경우 Generate 통화를 동기화해야합니다.

발전기의 사용법은 간단합니다. 발전기 클래스로 정규화 된 이름을 사용하면됩니다.

관련 문제