NServicebus 无法解析处理程序中接口的服务

问题描述

我正在尝试构建我的第一个 NserviceBus 应用程序,但我无法让它工作。消息到达“后端”,但处理程序使用 DI,NServicebus 声称它找不到接口的服务。但是代码是直接从示例中提取的。我遗漏了一些东西,我无法弄清楚。

错误: 调试:NServiceBus.LoadHandlersConnector[0] 处理消息类型:Messages.JobStartCommand 消息头: NServiceBus.MessageId : 0044f261-e3b3-4287-b6f0-ad7400ef43cb NServiceBus.MessageIntent : 发送 NServiceBus.ConversationId : bb4f276f-63fe-450b-b234-ad7400ef43cd NServiceBus.CorrelationId : 0044f261-e3b3-4287-b6f0-ad7400ef43cb NServiceBus.ReplyToAddress : ClientUI NServiceBus.OriginatingMachine : L19002992 NServiceBus.OriginatingEndpoint : ClientUI $.diagnostics.originating.hostid : e1fecb2b72b8185e47341bb4dfb37dd7 NServiceBus.ContentType : 文本/xml NServiceBus.EnclosedMessageTypes : Messages.JobStartCommand,Messages,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null NServiceBus. 版本:7.5.0 NServiceBus.TimeSent : 2021-07-29 14:31:08:228497 Z NServiceBus.Retries : 3 NServiceBus.Retries.Timestamp : 2021-07-29 14:31:40:397277 Z 要调用的处理程序: Extractor.JobStartHandler Extractor.JobStartHandler 信息:NServiceBus.RecoverabilityExecutor[0] 由于异常,立即重试将重试消息“0044f261-e3b3-4287-b6f0-ad7400ef43cb”: system.invalidOperationException:尝试激活“Extractor.JobStartHandler”时无法解析“IExtract”类型的服务。 在 Microsoft.Extensi

我的后端程序.cs

using Microsoft.Extensions.Hosting;
using System;
using System.Diagnostics;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NServiceBus;
using System.Threading.Tasks;
using Messages;
using Extractor;

namespace ExtractorOsiris
{
    class Program
    {
      
        static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var builder = Host.CreateDefaultBuilder(args);
            builder.UseWindowsService();

            //builder.UseMicrosoftLogFactoryLogging();
            builder.ConfigureLogging((ctx,logging) =>
            {
                logging.AddConfiguration(ctx.Configuration.GetSection("Logging"));

                //logging.AddEventLog();
                logging.AddConsole();
                logging.SetMinimumLevel(LogLevel.Debug);
            });

            #region back-end-use-nservicebus

            builder.UseNServiceBus(ctx =>
            {
                var endpointConfiguration = new EndpointConfiguration("Sample.Extractor");
                endpointConfiguration.UseTransport<LearningTransport>();

                var transport = endpointConfiguration.UseTransport<LearningTransport>();
                transport.Routing().RoutetoEndpoint(typeof(ProcessObjectCommand),"Sample.Processor");

                endpointConfiguration.DefineCriticalErrorAction(OnCriticalError);

                return endpointConfiguration;
            });

            #endregion

            #region back-end-register-service
            
            builder.ConfigureServices(services =>
            {
                services.AddSingleton<IExtract,ExtractOsiris>();
            });

           
            #endregion



            return builder;

        }

        private static Task OnCriticalError(ICriticalErrorContext arg)
        {
            throw new NotImplementedException();
        }
    }
}

界面

using Newtonsoft.Json.Linq;
using NServiceBus;
using System;
using System.Threading.Tasks;

namespace Extractor
{
    public interface IExtract
    {
        Task<JArray> Extract(string @object,DateTime deltaTime);
    }
}

处理程序

using System.Threading.Tasks;
using Messages;
using Newtonsoft.Json.Linq;
using NServiceBus;


namespace Extractor
{
    #region back-end-handler
    public class JobStartHandler : IHandleMessages<JobStartCommand>
    {
        private readonly IExtract extractor;

        public JobStartHandler(IExtract extractor)
        {
            this.extractor = extractor;
        }

        public async Task Handle(JobStartCommand message,IMessageHandlerContext context)
        {
            Task<JArray> result = extractor.Extract("Medewerkers",message.DeltaTime);
            await result;

            JArray test = result.Result;

            foreach (JObject x in test)
            {
                // send the object to be processed.
                //await context.Send(new ProcessObjectCommand(x.ToString()));
            }
        }
    }
    #endregion

}

接口的实现

using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Extractor;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NServiceBus;


namespace ExtractorOsiris
{
    public class ExtractOsiris : IExtract
    {
        private readonly ILogger logger;
       
        public ExtractOsiris(ILogger<ExtractOsiris> logger)
        {
            this.logger = logger; 
        }

        public Task<JArray> Extract(string @object,DateTime deltaTime)
        {
            logger.Loginformation($"getting {@object} for delta time {deltaTime}");

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://xx.yy");
            

            WebResponse response = request.GetResponse();

            JObject temp = JObject.Load(new JsonTextReader(new StreamReader(response.GetResponseStream())));



            return Task<JArray>.Fromresult(temp["items"] as JArray);
        }
    }
}

我知道代码并不漂亮,但它是纯粹的快速和肮脏的测试代码

解决方法

我从代码中清除了有问题的接口,但仍然在一个不再存在的接口上出现错误。我删除了 bin 文件夹并逐步构建了所有内容。愚蠢的是,源代码控制说我回到了我开始的地方,没有改变。它只是有效....

所以必须在 VS2019 上装一些愚蠢的东西。对不起任何浪费我时间的人

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...