NServiceBus与自定义NHibernate ConnectionProvider

时间:2011-07-25 11:10:39

标签: nhibernate nservicebus

问题: NSB不会使用我们的Custom 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);            }
    }

Config与标准的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 通过 DriverConnectionProvider :)实现 IConnectionProvider :S。

亲切的问候

1 个答案:

答案 0 :(得分:1)

NServiceBus合并并内化NHibernate。这意味着您继承的类与NSB引用的类(DriverConnectionProvider)不同。 NSB 2.5中唯一的解决方法是使用不兼容任何依赖项的仅核心版本的NSB。当我们将NH支持移动到没有合并的单独的dll时,这将在3.0中发生变化。

另一种选择是建立自己的子库(读取:复制和粘贴,然后再粘贴NSB)

希望这有帮助!