如何配置MassTransit.RuntimeServices以自动生成订阅数据库?

时间:2014-01-09 15:11:31

标签: c# .net nhibernate fluent-nhibernate masstransit

我希望Masstransit订阅服务使用的数据库在第一次访问时不存在时自动创建。

我对NHibernate知之甚少,无法自己解决这个问题。在实体框架中,配置数据库自动生成是微不足道的,但是there seems to be no EF integration with MT yet。如果我直接处理NHibernate,我发现some code snippets可能会有效,但我不知道我应该把这段代码放在哪里,这样它就能用于为MassTransit创建的额外抽象层。

这是我对MT所要求的sessionfactory的容器注册:

.RegisterType<ISessionFactory>
  (new ContainerControlledLifetimeManager(),
   new InjectionFactory(_context => new NHibernateSessionFactoryProvider(new[]
                                    {
                                        typeof (SubscriptionSagaMap),
                                        typeof (SubscriptionClientSagaMap)
                                    }).GetSessionFactory()))

我尝试弄乱第二个NHibernateSessionFactoryProvider构造函数的参数无济于事。无论我做什么,我总是得到这个例外:

  

InvalidOperationException异常:   “无法创建会话工厂”

     

的InnerException:   System.Data.SqlClient.SqlException:   “不能打开   登录请求的数据库“DbTest”。登录失败。登录   用户'[my_user]'失败。“

2 个答案:

答案 0 :(得分:2)

您可以切换到NHibernate的SQLite提供程序或类似的东西。

还有一个SQL脚本用于设置源存储库中可用的数据库:

https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit.RuntimeServices/SetupSQLServer.sql

它也可能包含在ZIP发行版中,我不是正面的。如脚本所示,需要许多索引来确保服务执行大量订阅。

答案 1 :(得分:0)

尝试这种方式

container = new UnityContainer();
        MassTransit.Log4NetIntegration.Logging.Log4NetLogger.Use();

        // Register the ServiceBus to our container.
        container.RegisterInstance<IServiceBus>(ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.ReceiveFrom("msmq://localhost/Mt_Msmq_Saga_Unity");
            sbc.SetConcurrentConsumerLimit(100);
            sbc.UseControlBus();
            sbc.SetCreateMissingQueues(true);
            sbc.SetPurgeOnStartup(true);
            //sbc.UseMulticastSubscriptionClient();

            sbc.Subscribe(subs =>
            {
                subs.LoadFrom(container);
                subs.Saga<RfqSubmittedSaga>(new NHibernateSagaRepository<RfqSubmittedSaga>(Fluently
                    .Configure()
                    .Database(
                        MsSqlConfiguration.MsSql2012
                            .AdoNetBatchSize(100)
                            .ConnectionString(s => s.Is("Server=192.168.0.2\\SQL2012EXP;initial catalog=MTSaga; User Id=sa; Password=mypassword;"))
                            .DefaultSchema("dbo")
                            .Raw(NHibernate.Cfg.Environment.Isolation, IsolationLevel.Serializable.ToString()))
                    .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate")
                    .Mappings(m =>
                    {
                        // Tell Fluent NHibernate about our mapping to store the Saga.
                        m.FluentMappings.Add<RfqSubmittedSagaMap>();
                    })
                    .ExposeConfiguration(c => new SchemaUpdate(c).Execute(false, true))
                    .BuildSessionFactory())).Permanent();
            });
        }));