由于 serviceProvider.GetService<IRabbitMQConsumer>() 返回 null,无法添加单例服务
Unable to add a singleton service due to serviceProvider.GetService<IRabbitMQConsumer>() returning null
我正在尝试将 IRabbitMQConsumer 中提到的类型和 RabbitMQConsumer 中的实现类型的单例服务添加到 Iservicecollection。
但是当我尝试使用以下方法时,我收到空引用异常,因为 GetService 正在返回空值。
这段代码在我使用 .Net core 2.2 时有效,但在我迁移到 .Net core 3.1.12 时出现问题。我已经尝试了很多堆栈溢出线程,如下所示,它似乎是正确的,但不确定为什么我的代码会抛出异常。
,
请在下面找到我的代码并帮助我解决这个问题,因为我是这些中间件的初学者。
#Program.cs
internal class Program
{
private static void Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
IServiceProvider serviceProvider = services.BuildServiceProvider();
Startup startup = new Startup();
startup.ConfigureServices(services, logger);
//configure console logging
serviceProvider.GetService<ILoggerFactory>();
var logger = serviceProvider.GetService<ILoggerFactory>(); // logger returns null
//do the actual work here
var client = serviceProvider.GetService<IRabbitMQConsumer>(); // client returns null
client.CreateConnection();
client.ProcessMessages();
}
}
#startup.cs
public class Startup
{
private static readonly Logger _log = LogManager.GetCurrentClassLogger();
IConfigurationRoot Configuration { get; }
public Startup()
{
LogManager.LoadConfiguration(string.Concat(Directory.GetCurrentDirectory(), "/NLog.config"));
}
public void ConfigureServices(IServiceCollection services, ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog(); // System.NullReferenceException
services.AddSingleton<IRabbitMQConsumer, RabbitMQConsumer>();// System.NullReferenceException
}
}
您需要在调用 BuildServiceProvider
之前配置 ServiceCollection。
在您的情况下,您应该将 IServiceProvider serviceProvider = services.BuildServiceProvider();
行向下移动到 startup.ConfigureServices(services, logger);
下面
我正在尝试将 IRabbitMQConsumer 中提到的类型和 RabbitMQConsumer 中的实现类型的单例服务添加到 Iservicecollection。
但是当我尝试使用以下方法时,我收到空引用异常,因为 GetService
这段代码在我使用 .Net core 2.2 时有效,但在我迁移到 .Net core 3.1.12 时出现问题。我已经尝试了很多堆栈溢出线程,如下所示,它似乎是正确的,但不确定为什么我的代码会抛出异常。
#Program.cs
internal class Program
{
private static void Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
IServiceProvider serviceProvider = services.BuildServiceProvider();
Startup startup = new Startup();
startup.ConfigureServices(services, logger);
//configure console logging
serviceProvider.GetService<ILoggerFactory>();
var logger = serviceProvider.GetService<ILoggerFactory>(); // logger returns null
//do the actual work here
var client = serviceProvider.GetService<IRabbitMQConsumer>(); // client returns null
client.CreateConnection();
client.ProcessMessages();
}
}
#startup.cs
public class Startup
{
private static readonly Logger _log = LogManager.GetCurrentClassLogger();
IConfigurationRoot Configuration { get; }
public Startup()
{
LogManager.LoadConfiguration(string.Concat(Directory.GetCurrentDirectory(), "/NLog.config"));
}
public void ConfigureServices(IServiceCollection services, ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog(); // System.NullReferenceException
services.AddSingleton<IRabbitMQConsumer, RabbitMQConsumer>();// System.NullReferenceException
}
}
您需要在调用 BuildServiceProvider
之前配置 ServiceCollection。
在您的情况下,您应该将 IServiceProvider serviceProvider = services.BuildServiceProvider();
行向下移动到 startup.ConfigureServices(services, logger);