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