Sagas是否与Unobtrusive模式一起使用?

时间:2013-11-06 19:42:01

标签: nservicebus saga nservicebus4

我有一个名为UploadService的端点,它包含由另一个程序集中定义的命令启动的saga。该程序集中的命令通过以下行注册到端点的初始化中:

public class EndpointInitialization : IWantCustomInitialization
    {
        public void Init()
        {
            NServiceBus.Configure.Features.Enable<NServiceBus.Features.Sagas>();

            NServiceBus.Configure.With()
              .Log4Net()
              .UseInMemoryTimeoutPersister()
              .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"))
              .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.Contains("Messages"))
              .UnicastBus()
                 .ImpersonateSender(false)
              .CreateBus()
              .Start();
        }
    }

但是,当通过Debug-&gt;启动新实例启动端点时,NServiceBus.Core会抛出以下异常:

&#34;传奇&#39; MySaga&#39;实施&#39; IHandleMessages`1&#39;但消息类型&#39; MyCommand&#39;不属于消息。你应该使用&#39; Unobtrusive Mode Messages&#39;或者消息应该实现&#39; IMessage&#39;,&#39; IEvent&#39;或者&#39; ICommand&#39;。&#34;

我有一个seprate端点引用相同的Commands程序集,并且以相同的方式定义自定义初始化,并且启动就好了(唯一不同的是另一个端点不使用sagas)。

更新:我使用的是NServiceBus 4.2

1 个答案:

答案 0 :(得分:2)

是。 Sagas可以在Unobtrusive模式下工作。在实现IConfigureThisEndpoint的类中调用初始化代码,在该类中创建总线实例并为您解决问题。

例如:

 public class EndpointConfig: IConfigureThisEndpoint, AsA_Publisher,  IWantCustomInitialization
{
    public void Init()
    {
        var container = new WindsorContainer();
        Configure.With()
            .CastleWindsorBuilder(container)
            .FileShareDataBus(@"..\..\..\DataBusShare\")
            .DefiningDataBusPropertiesAs(p => p.Name.EndsWith("DataBus"))
            .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"))
            .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events"))
            .DefiningMessagesAs(t => t.Namespace == "Messages")
            .DefiningEncryptedPropertiesAs(p => p.Name.StartsWith("Encrypted"))
            .UseNHibernateSagaPersister()
            .UseNHibernateTimeoutPersister()
            .UseNHibernateSubscriptionPersister();
        Configure.Serialization.Json();

    }
}