C# 在CustomErrorHandler中访问IBU和IConfiguration
我已经在rebus中创建了一个自定义错误处理程序,它继承了IErrorHandler作为C# 在CustomErrorHandler中访问IBU和IConfiguration,c#,rebus,C#,Rebus,我已经在rebus中创建了一个自定义错误处理程序,它继承了IErrorHandler作为 public class CustomErrorHandler : IErrorHandler { IBus bus; IConfiguration configuration; public CustomErrorHandler(IBus bus,IConfiguration configuration) { this.bus = bus;
public class CustomErrorHandler : IErrorHandler
{
IBus bus;
IConfiguration configuration;
public CustomErrorHandler(IBus bus,IConfiguration configuration)
{
this.bus = bus;
this.configuration = configuration;
}
public async Task HandlePoisonMessage(TransportMessage
transportMessage, ITransactionContext transactionContext, Exception
exception)
{---
This is to enable me access bus and configuration instance in my error handler.
但是,当我尝试注册处理程序时
services.AddRebus(configure => configure
.Options(o =>
{
o.Register<IErrorHandler>(c => new
CustomErrorHandler(c.Get<IBus>(),
c.Get<IConfiguration>()));
})...
services.AddRebus(配置=>configure
.选项(o=>
{
o、 寄存器(c=>new
CustomErrorHandler(c.Get(),
c、 Get());
})...
我得到一个堆栈溢出异常
但是,如果我创建了一个没有参数的错误处理程序,那么就可以了
请帮助我们在创建的CustomErrorHandler中获取IBus和IConfiguration的实例
我想像下面这样使用它:
public async Task HandlePoisonMessage(TransportMessage
transportMessage, ITransactionContext transactionContext, Exception
exception)
{
int MaxDeferCount = this.configuration.GetValue<int>
("Settings:MaxDeferCount");
int deferCount = 1;
if (transportMessage.Headers.ContainsKey("rbs2-defer-count"))
{
deferCount = int.Parse(transportMessage.Headers["rbs2-defer-
count"]);
}
if (deferCount <= MaxDeferCount)
{
deferCount++;
var delay = TimeSpan.FromSeconds(2 * deferCount);
var additionalHeaders = new Dictionary<string, string>
{
{ "rbs2-defer-count", deferCount.ToString()}
};
await bus.Advanced.TransportMessage.Defer(delay,
additionalHeaders);
}
else
{
var details = exception.Message;
var headers = new Dictionary<string, string>
{
{Headers.SourceQueue,
transportMessage.Headers["rbs2-sender-
address"]},
{Headers.ErrorDetails, details}
};
await bus.Advanced.TransportMessage.
Forward("rebus_claims_processing_errors", headers);
}
公共异步任务HandlePoisonMessage(TransportMessage
transportMessage,ITransactionContext transactionContext,异常
例外情况)
{
int MaxDeferCount=this.configuration.GetValue
(“设置:MaxCount”);
整数计数=1;
if(transportMessage.Headers.ContainsKey(“rbs2延迟计数”))
{
deferCount=int.Parse(transportMessage.Headers[“rbs2延迟-
计数“]);
}
如果(延迟计数您是否能够获得堆栈跟踪?还显式地注入设置值,无需注入IConfiguration
。堆栈溢出最有可能来自与IBus
相关的循环引用,因为您在错误处理程序中处理原始TransportMessage
,这可能就足够了h最好得到ITransport
injectedAlso@Nkosi所说的循环引用是正确的