ISessionFactoryKeyProvider отсутствует в CommonServiceLocator при обновлении NHibernate с 2.1 до 3.0 - PullRequest
1 голос
/ 10 июня 2011

У меня есть приложение ASP.NET MVC, которое использует Spring.NET 1.2 для внедрения зависимостей и NHibernate 2.1 для ORM.Он работал на MVC 3, используя S # arp Architecture в слегка измененной версии, которую мы сами собирали, и от которой я сейчас пытаюсь избавиться.(Т.е. я собираюсь начать использовать ссылочные SharpArch .dll вместо чистого исходного кода.)

Инициализация Spring выполняется с помощью советов, взятых из здесь , а также с использованием SpringServiceLocatorAdapter, найденного здесь .NH инициализируется с помощью NHibernateSession.Init от SharpArch, который задается нашими двумя путями сборки.Сопоставление выполняется с файлами XML HBM.

Решение перейти на NH 3 привело к серьезному случаю DLL Hell, из-за которого мне, конечно, пришлось обновить FluentNH, NH Validator, SharpArch, Spring иВиндзорский замокЧтобы все заработало, потребовалось много ручного труда, изменение ссылок и незначительные исправления кода.Все это было ожидаемо.

Теперь у меня достаточно хорошо работает программное обеспечение, поэтому Spring инициализируется и DI работает правильно.Но когда репозиторий пытается использовать свой объект Session, я получаю следующую ошибку.

Ошибка создания объекта с именем '': не определены службы типа 'SharpArch.NHibernate.ISessionFactoryKeyProvider'

Я пытался выяснить причину этогодля лучшей части дня сейчас.Мне кажется, что SpringServiceLocatorAdapter устарел, но я не могу найти информацию об этом.Кроме того, простое исключение его использования приводит к тому, что Sessions в репозиториях имеют значение null и, следовательно, NullReferenceExceptions.Но, насколько я знаю, проблема также может быть в том, как инициализируется NH.

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

Спасибо большое!Я, конечно, предоставлю больше информации, если это необходимо.

1 Ответ

1 голос
/ 13 июня 2011

Вам необходимо зарегистрировать реализацию ISessionFactoryKeyProvider с помощью Spring, реализация по умолчанию - DefaultSessionFactoryKeyProvider, в windsor оператор будет выглядеть так:

        container.Register(
                Component.For(typeof(ISessionFactoryKeyProvider))
                    .ImplementedBy(typeof(DefaultSessionFactoryKeyProvider))
                    .Named("sessionFactoryKeyProvider"));
...