Hellooo Rebus粉丝,我们使用Rebus 0.84 aka 1.0已有很多年了,现在已经升级到4.0版本,在实现和性能方面似乎有很多改进,但是在< strong>为处理程序执行命令。
以前版本中的示例,我们曾经做过
public class RebusInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
Configure.With(new WindsorContainerAdapter(container))
.Logging(l => l.Log4Net())
.Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
.SpecifyOrderOfHandlers(t => t.First<AuthenticationHandler>())
.Serialization(x => x.UseJsonSerializer())
.MessageOwnership(m => m.FromRebusConfigurationSection())
.Sagas(m => m.StoreInNDb())
.Subscriptions(m => m.StoreInNDb())
.Timeouts(m => m.StoreInMemory())
.Events(e =>
{
e.MessageSent += (advancedbus, destination, message) =>
{
var timeToBeReceived = ConfigurationManager.AppSettings["TimeToBeReceived"];
if (string.IsNullOrEmpty(timeToBeReceived))
timeToBeReceived = "00:00:30";
if (timeToBeReceived != "-1")
{
advancedbus.AttachHeader(message, Headers.TimeToBeReceived, timeToBeReceived);
advancedbus.AttachHeader(message, Headers.Express, "rebus-express");
}
};
})
.CreateBus()
.Start();
}
}
现在,如果我要在rebus 4.0上实现相同的功能,则在尝试“ SpecifyOrderOfHandlers”时会给出编译时错误,即它不接受任何参数,那么我们如何实现处理程序的排序,以下是rebus 4.0的实现
using Rebus.Config;
using Rebus.Persistence.InMem;
using Rebus.Handlers;
using Rebus.Messages;
public void Install(IWindsorContainer container, IConfigurationStore store)
{
Configure.With(new CastleWindsorContainerAdapter(container))
.Options(o =>
{
o.SpecifyOrderOfHandlers(o => o.First<AuthenticationHandler>());
})
.Logging(l => l.Log4Net())
.Transport(t => t.UseMsmq(ConfigurationManager.AppSettings["InputQueue"]))
.Routing(r => r.TypeBasedRoutingFromAppConfig())
.Sagas(m => m.StoreInNDb())
.Subscriptions(m => m.StoreInNDb())
.Timeouts(m => m.StoreInMemory())
.Events(e =>
{
e.BeforeMessageSent += (bus, headers, message, context) =>
{
var timeToBeReceived = ConfigurationManager.AppSettings["TimeToBeReceived"];
if (string.IsNullOrEmpty(timeToBeReceived))
timeToBeReceived = "00:00:30";
if (timeToBeReceived != "-1")
{
headers.Add(Headers.TimeToBeReceived, timeToBeReceived);
headers.Add(Headers.Express, "rebus-express");
}
};
})
.Start();
}
请提出如何使用Rebus 4.0实现处理程序订购的方法,并告诉我上述实现Rebus 4.0的方法是否正确或需要改进。
答案 0 :(得分:1)
您只是简单地拨打了SpecifyOrderOfHandlers
的电话,有点太复杂了–这应该可以解决问题:
Configure.With(activator)
(...)
.Options(o =>
{
o.SpecifyOrderOfHandlers()
.First<AuthenticationHandler>();
})
.(...)
.Start();
如果不是很明显,可能是因为SpecifyOrderOfHandlers
在另一个名称空间中,所以如果添加
using Rebus.Handlers.Reordering;
在文件顶部的某个位置,那么我敢打赌,IntelliSense会指导您:)