NServiceBus с пользовательским NHibernate ConnectionProvider - PullRequest
0 голосов
/ 25 июля 2011

Проблема: 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.

С уважением

1 Ответ

1 голос
/ 26 июля 2011

NServiceBus объединяет и усваивает NHibernate. Это означает, что унаследованный вами класс отличается от того, на который ссылается NSB (DriverConnectionProvider). Единственный обходной путь в NSB 2.5 - это использование версии NSB только для ядра, которая не объединяет никаких зависимостей. Все это изменится в 3.0, когда мы переместим поддержку NH в отдельную dll без слияния.

Другой вариант - создать собственное хранилище (читай: копировать и вставлять, а затем NSB)

Надеюсь, это поможет!

...