问题: 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。
亲切的问候
答案 0 :(得分:1)
NServiceBus合并并内化NHibernate。这意味着您继承的类与NSB引用的类(DriverConnectionProvider)不同。 NSB 2.5中唯一的解决方法是使用不兼容任何依赖项的仅核心版本的NSB。当我们将NH支持移动到没有合并的单独的dll时,这将在3.0中发生变化。
另一种选择是建立自己的子库(读取:复制和粘贴,然后再粘贴NSB)
希望这有帮助!