我已经将我的控制台应用程序的Main配置如下
var services = new ServiceCollection()
.AddLogging(logging => logging.AddConsole())
.BuildServiceProvider();然后我尝试在另一个类中使用它,像这样
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public void MyFunc()
{
_logger.Log(LogLevel.Error, "My Message");
}System.InvalidOperationException:“无法解析”Microsoft.Extensions.Logging.ILogger“类型的服务
我尝试过这里的解决方案,但它对我没有用。
编辑基于Yaakov下面的评论和这则Github评论,我可以通过这样做正确地解决这个问题
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}我本希望在初始的BuildServiceProvider中使用这种方式,但是每次我想使用记录器(或者创建自己的ILogger)时,我似乎都要重复这一点。
发布于 2019-08-21 10:56:27
默认情况下,ILogger不再注册,但ILogger<T>注册。如果您仍然想使用ILogger,可以使用以下(在Startup.cs中)手动注册它:
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<AnyClass>>();
services.AddSingleton(typeof(ILogger), logger);
...
}其中AnyClass可以是通用的,例如:
public class ApplicationLogs
{
}所以:
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
services.AddSingleton(typeof(ILogger), logger);
...
}ILogger现在将通过构造函数注入进行解析。
发布于 2018-10-22 03:25:54
我假设您使用的是.net核心web应用程序的默认模板。
在您的Startup.cs中,您应该有一个类似于↓↓↓↓↓↓↓的方法
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
//Do the service register here and extra stuff you want
services.AddLogging(config =>
{
config.AddDebug();
config.AddConsole();
//etc
});
}编辑:我已经为你编写了一个简单的程序来展示它是如何工作的。
public class MyClass
{
private readonly ILogger<MyClass> _logger;
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
public void MyFunc()
{
_logger.Log(LogLevel.Error, "My Message");
}
}
public class Program
{
public static void Main(string[] args)
{
var services = new ServiceCollection().AddLogging(logging => logging.AddConsole());
services.AddSingleton<MyClass>();//Singleton or transient?!
var s = services.BuildServiceProvider();
var myclass = s.GetService<MyClass>();
}
}

编辑:程序的输出:

发布于 2020-07-16 08:20:27
在.NET核心中,ILogger<T>会自动为您注册。由于ILogger<T>继承自ILogger,您可以从IServiceProvider中请求ILogger<T>的实例。
例如:services.AddSingleton<ILogger>(svc => svc.GetRequiredService<ILogger<MyClassType>>());
请注意,只要您有一个非泛型的ILogger<MyClassType>构造函数参数,就会返回一个ILogger,因此,如果需要多个参数,可以使用AddSingleton (或瞬态/或作用域) implementationFactory覆盖来专门为该实例创建它。
https://stackoverflow.com/questions/52921966
复制相似问题