Проблема:
NSB не будет использовать наш пользовательский NHB ConnectionProvider.
Я настраиваю NSB в коде со следующей настройкой (log4net - единственная вещь в файле app.config):
NServiceBus.SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure);
NServiceBus.Configure.With()
.CustomConfigurationSource(ObjectFactory.GetInstance<IConfigurationSource>())
.StructureMapBuilder()
.XmlSerializer()
.DBSubcriptionStorage(GetNHibernateConfiguration(), false)
.MsmqTransport()
.IsTransactional(false)
.PurgeOnStartup(false)
.UnicastBus()
.LoadMessageHandlers( First<MyEventHandler1>
.Then<MyEventHandler2>())
.CreateBus()
.Start();
И это работает до тех пор, пока я не использую хранилище DBSubscription вместо хранилища MSMQ. Но мне нужно DBStorage.
В настоящее время у нас есть свой собственный ConnectionProvider, который отлично работает примерно в 10-15 других проектах, но когда я пытаюсь использовать его с NSB, я получаю ошибку, которая не имеет никакого смысла для меня. Если я опускаю ConnectionProvider и перехожу со стандартным NHB, тогда он работает просто отлично.
Пользовательский провайдер:
public class MyProvider : DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
var oracleRoleProvider = new OracleRoleProvider();
var dbConnection = Driver.CreateConnection();
return oracleRoleProvider.SetUserRoles(dbConnection); }
}
Конфиг, который работает со стандартным провайдером NHB (но это , а не , что я хочу):
retval.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
retval.Add("connection.driver_class", "NHibernate.Driver.OracleDataClientDriver");
retval.Add("connection.connection_string", "User Id=user;Password=pass;Pooling=False;Data Source=test");
retval.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
Конфигурация, которая не работает, но должна:
retval.Add("connection.provider", "MyNamespace.MyProvider, MyNamespace");
retval.Add("connection.driver_class", "NHibernate.Driver.OracleDataClientDriver");
retval.Add("connection.connection_string", "User Id=user;Password=pass;Pooling=False;Data Source=test");
retval.Add("dialect", "NHibernate.Dialect.Oracle10gDialect");
Исключение:
Exception:
Could not instantiate connection provider: MyProvider
Inner:
Unable to cast object of type 'MyProvider' to type 'NHibernate.Connection.IConnectionProvider'.
Используемые версии
NServiceBus: 2.5.0.1476
NHibernate: 3.1.0.4000
Может кто-нибудь пролить свет на эту проблему?
Я вырываю свои волосы здесь, очевидно, MyProvider реализует IConnectionProvider через DriverConnectionProvider :): S.
С уважением