Исключение при попытке настроить NServiceBus для использования постоянства NHibernate
Я пытаюсь заставить несколько конечных точек использовать постоянство NHibernate после использования постоянного хранения в памяти для разработки. Я использую последние пакеты Nuget.
Сразу же я получаю следующие исключения. В нем упоминается Topshelf, на котором основан NServiceBus.Host, но я понятия не имею, почему.
Пожалуйста, обратите внимание: я не получаю никаких ошибок, используя постоянство в памяти.
Исключение: "System.InvalidOperationException" в NServiceBus.NHibernate.dll Исключение: "System.InvalidOperationException" в NServiceBus.Host.exe Исключение: "Magnum.StateMachine.StateMachineException" в NServiceBus.Host.exe Дополнительная информация: исключение произошло в Topshelf.Internal.ServiceController`1[[NServiceBus.Hosting.Windows.WindowsHost, NServiceBus.Host, Version=6.0.0.0, Culture= нейтральный, PublicKeyToken=9fc386479f8a226c]] во время состояния Initial при обработке OnStart
Возникло исключение: 'Magnum.StateMachine.StateMachineException' в NServiceBus.Host.exe Дополнительная информация: Исключение произошло в Topshelf.Internal.ServiceController`1[[NServiceBus.Hosting.Windows.WindowsHost, NServiceBus.Host, Version=6.0.0.0, Culture= нейтральный, PublicKeyToken=9fc386479f8a226c]] во время состояния Initial при обработке OnStart
Возникло исключение: "System.InvalidOperationException" в mscorlib.dll Произошло необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительная информация: в файле конфигурации не найдены свойства NHibernate (E:\Projects.........\MyEndpoint.dll.config).
Для запуска NServiceBus с NHibernate вам нужно как минимум указать строку подключения к базе данных. Вот пример того, что требуется:
<!-- other optional settings examples --> <add key="NServiceBus/Persistence/NHibernate/connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> <add key="NServiceBus/Persistence/NHibernate/connection.driver_class"
значение ="NHibernate.Driver.Sql2008ClientDriver"/>
<!-- Optional overrides per persister --> <add name="NServiceBus/Persistence/NHibernate/Timeout" connectionString="Data Source=.\SQLEXPRESS;Initial
Каталог = время ожидания; Интегрированная безопасность =True" />
В документации не говорится, что эти настройки являются обязательными в app.config каждой конечной точки. Я хочу настроить это исключительно в коде. Это вообще возможно?
Это моя конфигурация NH, для которой я создал пустую базу данных SqlServer 2014 под названием "nservicebus":
config.EnableInstallers();
var nhConfig = new Configuration
{
Properties =
{
["dialect"] = "NHibernate.Dialect.MsSql2012Dialect",
["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
["connection.driver_class"] = "NHibernate.Driver.Sql2012ClientDriver"
}
};
config.UsePersistence<NHibernatePersistence>().UseConfiguration( nhConfig );
....
Что мне не хватает? Документация звучит просто, но это не так.
РЕДАКТИРОВАТЬ
То, что сделало эту работу, было сделать это следующим образом:
config.EnableInstallers();
//OLD, didn't work
//var nhConfig = new Configuration
//{
// Properties =
// {
// ["dialect"] = "NHibernate.Dialect.MsSql2012Dialect",
// ["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
// ["connection.driver_class"] = "NHibernate.Driver.Sql2012ClientDriver"
// }
//};
var nhConfiguration = new Configuration();
nhConfiguration.SetProperty( NHibernate.Cfg.Environment.ConnectionProvider, "NHibernate.Connection.DriverConnectionProvider" );
nhConfiguration.SetProperty( NHibernate.Cfg.Environment.ConnectionDriver, "NHibernate.Driver.Sql2008ClientDriver" );
nhConfiguration.SetProperty( NHibernate.Cfg.Environment.Dialect, "NHibernate.Dialect.MsSql2008Dialect" );
nhConfiguration.SetProperty( NHibernate.Cfg.Environment.ConnectionStringName, "NServiceBus/Persistence" );
config.UsePersistence<NHibernatePersistence>().UseConfiguration( nhConfiguration );
MsSql2008Dialect также работает с Sql 2012, 2014.
В app.config остается строка подключения, которая мне так или иначе нужна для Entity Framework.
Но, как упоминает @DavidBoike ниже, вы также можете извлечь это из app.config и настроить его программно.
1 ответ
Вы можете легко настроить строку подключения в коде:
busConfiguration.UsePersistence<NHibernatePersistence>()
.ConnectionString("your-connection-string-here");
Вы должны включить NServiceBus.Persistence
пространство имен для метода расширения, который будет доступен.
Вы правы, что страница документации NHibernate Persistence не охватывает просто очень хорошую настройку строки подключения. Я открыл проблему GitHub в хранилище документов, чтобы отследить это.