Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CustomErrorHandler中访问IBU和IConfiguration_C#_Rebus - Fatal编程技术网

C# 在CustomErrorHandler中访问IBU和IConfiguration

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;

我已经在rebus中创建了一个自定义错误处理程序,它继承了IErrorHandler作为

 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所说的循环引用是正确的