为长篇文章道歉!
我正在尝试在aspnet核心2.1中为RabbitMQ构建一个消息监听器 . 一旦我发布消息,我在日志中收到此错误:
2018-09-29 12:35:35.459 INFO NServiceBus.RecoverabilityExecutor由于异常,立即重试将重试消息'ab43':System.InvalidOperationException:无法解析类型:Event.Processor.Listener.CustomerReceivedHandler,服务名称:--- > System.InvalidOperationException:未解析的依赖项[目标类型:Event.Processor.Listener.CustomerReceivedHandler],[参数:DbProvider(Event.Processor.Listener.IDbProvider)],[请求的依赖项:ServiceType:Event.Processor.Listener.IDbProvider,ServiceName :]在LightInject.ServiceContainer.EmitConstructorDependency的C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:Line 3443中的LightInject.ServiceContainer.GetEmitMethodForDependency(依赖关系依赖)(IE Launcher ,依赖关系依赖)在LightInject.ServiceContainer.EmitConstructorDepen的C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:line 3402中拒绝(ConstructionInfo constructionInfo,IEmitter emitter,Action 1 decoratorTargetEmitter) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\ObjectBuilder\LightInject\LightInject.g.cs:line 3368 at LightInject.ServiceContainer.EmitNewInstanceUsingImplementingType(IEmitter emitter, ConstructionInfo constructionInfo, Action
1 decoratorTargetEmitMethod)位于C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:第3329行,位于LightInject.ServiceContainer.EmitNewInstance(ServiceRegistration serviceRegistration) ,IEmitter Launcher )在C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:第3286行,位于C:\ BuildAgent中的LightInject.ServiceContainer.CreateDynamicMethodDelegate(Action 1 serviceEmitter) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\ObjectBuilder\LightInject\LightInject.g.cs:line 3030 at LightInject.ServiceContainer.CreateInstanceDelegateIndex(Action
1 emitMethod) work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:第3868行,位于C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus中的LightInject.ServiceContainer.EmitLifetime(ServiceRegistration serviceRegistration,Action 1 emitMethod, IEmitter emitter) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\ObjectBuilder\LightInject\LightInject.g.cs:line 3857 at LightInject.ServiceContainer.<>c__DisplayClass139_0.<CreateEmitMethodWrapper>b__0(IEmitter ms) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\ObjectBuilder\LightInject\LightInject.g.cs:line 3109 at LightInject.ServiceContainer.CreateDynamicMethodDelegate(Action
1 serviceEmitter) .Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:位于C:\ BuildAgent \的LightInject.ServiceContainer.CreateDelegate(类型serviceType,String serviceName,Boolean throwError)中的第3030行work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:第3915行---内部异常堆栈跟踪结束---在LightInject.ServiceContainer.CreateDelegate(类型serviceType,String serviceName,Boolean throwError)在C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:第3920行,位于C:\ BuildAgent \ work \ b549d46003942065中的LightInject.ServiceContainer.CreateDefaultDelegate(类型serviceType,Boolean throwError) \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject.g.cs:位于C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ ObjectBuilder \ LightInject \ LightInject中LightInject.ServiceContainer.GetInstance(Type serviceType)的第3878行.g.cs:第2740行,位于C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ Pipeline \ Incoming \ LoadHandlersConnector.cs中的LightInject.Scope.WithThisScope [T](Func 1 function) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\ObjectBuilder\LightInject\LightInject.g.cs:line 6220 at NServiceBus.LoadHandlersConnector.Invoke(IIncomingLogicalMessageContext context, Func
2阶段):NServiceBus第45行.MutateIncomingMessageBehavior.InvokeIncomingMessageMutators(IIncomingLogica lMessageContext上下文,Func 2 next) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\MessageMutators\MutateInstanceMessage\MutateIncomingMessageBehavior.cs:line 60 at NServiceBus.DeserializeLogicalMessagesConnector.Invoke(IIncomingPhysicalMessageContext context, Func
2阶段)在C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ Pipeline \ Incoming \ DeserializeLogicalMessagesConnector.cs:第33行NServiceBus.UnitOfWorkBehavior.InvokeUnitsOfWork(IIncomingPhysicalMessageContext context,Func 2 next) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\UnitOfWork\UnitOfWorkBehavior.cs:line 40 at NServiceBus.UnitOfWorkBehavior.InvokeUnitsOfWork(IIncomingPhysicalMessageContext context, Func
2 next)in C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ UnitOfWork \ UnitOfWorkBehavior.cs:第62行,位于C:\ BuildAgent \ work \ b549d46003942065 \ src \中的NServiceBus.MutateIncomingTransportMessageBehavior.InvokeIncomingTransportMessagesMutators(IIncomingPhysicalMessageContext context,Func 2 next) in C:\BuildAgent\work\b549d46003942065\src\NServiceBus.Core\MessageMutators\MutateTransportMessage\MutateIncomingTransportMessageBehavior.cs:line 59 at NServiceBus.ProcessingStatisticsBehavior.Invoke(IIncomingPhysicalMessageContext context, Func
2 next) NServiceBus.Core \ Performance \ Statistics \ ProcessingStatisticsBehavior.cs:位于C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ Pipeline \ Incoming \ TransportReceiveToPhysicalMessageProcessingConnector中的NServiceBus.TransportReceiveToPhysicalMessageProcessingConnector.Invoke(ITransportReceiveContext上下文,Func`2 next)第25行.cs:NServiceBus.MainPipelineExecutor.Invoke第39行(MessageContext消息) eContext)在C:\ BuildAgent \ work \ b549d46003942065 \ src \ NServiceBus.Core \ Pipeline \ MainPipelineExecutor.cs:第34行,位于NServiceBus.Transport.RabbitMQ.MessagePump.Process(BasicDeliverEventArgs message)中C:\ BuildAgent \ work \ 15dcdbe5f88af6ed \ src \ NServiceBus.Transport.RabbitMQ \ Receiving \ MessagePump.cs:第249行
的csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<AssemblyName>Event.Processor</AssemblyName>
<RootNamespace>Event.Processor</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Customer.Models" Version="1.0.21875" />
<PackageReference Include="lightinject" Version="5.2.0" />
<PackageReference Include="LightInject.Microsoft.DependencyInjection" Version="2.0.8" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="nservicebus" Version="7.1.4" />
<PackageReference Include="NServiceBus.RabbitMQ" Version="5.0.1" />
<PackageReference Include="odp.netcore" Version="2.0.12" />
<PackageReference Include="serilog" Version="2.7.1" />
<PackageReference Include="Serilog.aspnetcore" Version="2.1.1" />
<PackageReference Include="serilog.settings.configuration" Version="2.6.1" />
<PackageReference Include="serilog.sinks.console" Version="3.1.1" />
<PackageReference Include="serilog.sinks.file" Version="4.0.0" />
</ItemGroup>
<ItemGroup>
<Content Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello Processor");
});
}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
ServiceContainer container = new ServiceContainer(new ContainerOptions
{
EnablePropertyInjection = false
});
//The below didn't work either!
//services.AddSingleton<IDbProvider, DbProvider>();
//services.AddSingleton<IConfigSettings, ConfigSettings>();
//services.AddSingleton<IEncryptor, Encryptor>();
container.Register<IDbProvider, DbProvider>();
container.Register<IConfigSettings, ConfigSettings>();
container.Register<IEncryptor, Encryptor>();
return container.CreateServiceProvider(services);
}
}
Program.cs中
public class Program
{
public static void Main(string[] args)
try
{
var endpointConfiguration = new EndpointConfiguration("MSG_QUEUE");
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseConventionalRoutingTopology();
transport.ConnectionString("ConxnString");
endpointConfiguration.EnableInstallers();
endpointConfiguration.SendFailedMessagesTo("error");
endpointConfiguration.AutoSubscribe();
endpointConfiguration.UsePersistence<InMemoryPersistence>();
endpointConfiguration.UseSerialization<XmlSerializer>();
Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
//IEndpointInstance endpointInstance = Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
//endpointInstance.Stop().ConfigureAwait(false);
//Log.Information("Starting web host");
CreateWebHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
//Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
//Log.CloseAndFlush();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
MessageHandler.cs
public class CustomerReceivedHandler : IHandleMessages<PubSubObject>
{
private readonly IDbProvider _DbProvider;
private static readonly ILog Log = LogManager.GetLogger<CustomerReceivedHandler>();
public CustomerReceivedHandler(IDbProvider DbProvider)
{
_DbProvider = DbProvider;
// If I don't inject and initialize as below, it works fine
//_DbProvider = new DbProvider(new ConfigSettings(new Encryptor());
}
public Task Handle(PubSubObject message, IMessageHandlerContext context)
{
Log.Info($"Received message with id {context.MessageId}");
}
}
1 回答
显然我应该使用下面的代码:
我跟着后工作:https://docs.particular.net/samples/dependency-injection/aspnetcore/