Генерация идентификатора через COM-взаимодействие - PullRequest
2 голосов
/ 19 мая 2010

На данный момент у нас есть нереальный шарик кода, который предлагает интерфейс для стороннего приложения. Стороннее приложение имеет COM-сборку, которую ДОЛЖЕН использовать для создания новых записей. Этот процесс состоит из двух этапов: создать новый объект (в основном идентификатор) и обновить этот объект новыми значениями полей.
Поскольку COM-взаимодействие очень медленное, мы используем его только для генерации идентификатора (и связанных объектов) в базе данных. Фактическое обновление выполняется с помощью обычного 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 , которая вызывает COM-сборку в методе Generate. Это не проблема. Проблема в том, что COM-сборка требует инициализации, что занимает немного времени. По некоторым причинам ему также не нравятся несколько экземпляров в одном и том же процессе.
Что я хотел бы знать, так это то, есть ли способ получить доступ к внешней службе в коде генератора.

Я могу свободно использовать любую технику, какую захочу, поэтому, если она включает в себя что-то вроде контейнера IoC, это не проблема. То, что я ищу, это где именно подключить мой код, чтобы я мог получить доступ к вещам, которые мне нужны в моем генераторе, без необходимости прибегать к использованию синглетонов или других неприятных вещей.

1 Ответ

0 голосов
/ 19 мая 2010

Предполагая, что вам нужен один экземпляр компонента COM для всех ваших сущностей, можно использовать Service Locator (реализованный с любым контейнером IoC).

Ваша (тривиальная) реализация IIdentifierGenerator должна вызвать локатор в своем конструкторе, чтобы получить экземпляр компонента, и вызвать соответствующий метод для компонента на Generate.

Следует учитывать одну вещь: является ли COM-компонент потокобезопасным? Если нет, вам следует синхронизировать вызовы Generate.

Использовать генератор просто, просто используйте полное имя в качестве класса генератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...