使用不显眼模式进行传奇工作



>我有一个名为 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();
        }
    }

但是,当通过调试>启动新实例启动端点时,NServiceBus.Core 会引发以下异常:

"saga 'MySaga' 实现了 'IHandleMessages'1',但消息类型'MyCommand' 未归类为消息。您应该使用'不显眼模式消息',或者消息应该实现'IMessage','IEvent'或'ICommand'。

我有一个单独的端点,它引用相同的命令程序集,并以相同的方式定义自定义初始化,并且启动得很好(唯一的区别是另一个端点不使用 sagas)。

更新:我正在使用NServiceBus 4.2

是的。传奇确实在不显眼模式下工作。在实现 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();
    }
}

最新更新