C# 在运行Asp.NETCore2的Webapi 2上使用Serilog的DiiLogger
我正试图用Asp.NETCore2(MSSQLServer集成)将Serilog集成到我的WebApi 2中 我已经添加了nuget包,然后将以下内容添加到我的C# 在运行Asp.NETCore2的Webapi 2上使用Serilog的DiiLogger,c#,logging,asp.net-core-2.0,serilog,C#,Logging,Asp.net Core 2.0,Serilog,我正试图用Asp.NETCore2(MSSQLServer集成)将Serilog集成到我的WebApi 2中 我已经添加了nuget包,然后将以下内容添加到我的 public async void Configure(IApplicationBuilder应用程序、IHostingEnvironment环境、ILoggerFactory loggerFactory) 在myProgram.cs中,我有默认值 public static IWebHost BuildWebHost(stri
public async void Configure(IApplicationBuilder应用程序、IHostingEnvironment环境、ILoggerFactory loggerFactory)
在myProgram.cs
中,我有默认值
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
我得到以下错误
InvalidOperationException:在尝试激活“WebApi.Controller.TraderContactController”时,无法解析类型“Microsoft.Extensions.Logging.ILogger”的服务
我是否需要在Startup.cs中为
ILogger
物理设置一个单例。有人能告诉我这里缺少什么吗?正如我所设想的,因为日志记录内置于核心管道中,所以它知道如何解决这一问题。您需要重构控制器,以期望通用记录器ILogger
,它是从ILogger
派生的
[Route("api/[controller]")]
public class TraderController : Controller {
private TraderService _service;
private readonly ILogger _logger;
public TraderController(
Func<IBemfeitoDataContext> context,
ILogger<TraderController> logger //<-- note the change here
) {
_service = new TraderService(context, logger);
_logger = logger;
}
}
服务还应固定为依赖于ILogger
公共类TraderService:ITraderService{
专用只读ILogger记录器;
public TraderService(函数上下文,ILogger记录器){
this.logger=记录器;
//...
}
//…为简洁起见,删除了代码
}
控制器应该重构为依赖于服务抽象而不是实现
[Route("api/[controller]")]
public class TraderController : Controller {
private readonly ITraderService service;
private readonly ILogger logger;
public TraderController(ITraderService service, ILogger<TraderController> logger) {
this.service = service;
this.logger = logger;
}
//...
}
[路由(“api/[控制器]”)]
公共类TraderController:控制器{
专用只读ITraderService服务;
专用只读ILogger记录器;
公共交易控制器(ITraderService服务,ILogger记录器){
服务=服务;
this.logger=记录器;
}
//...
}
所有涉及的类在解析时都将显式地注入它们的依赖项
此答案假设
ITraderService
和TraderService
已在DI容器中注册。同时注入ILogger工厂
和通用ILogger
。这意味着您的控制器可以如下所示:
[Route("api/[controller]")]
public class TraderController : Controller {
private readonly ITraderService service;
private readonly ILogger logger;
public TraderController(ITraderService service, ILoggerFactory loggerFactory)
{
this.service = service;
this.logger = loggerFactory.CreateLogger<TraderController>();
}
//...
}
[路由(“api/[控制器]”)]
公共类TraderController:控制器{
专用只读ITraderService服务;
专用只读ILogger记录器;
公共交易控制器(ITraderService服务,iLogger工厂loggerFactory)
{
服务=服务;
this.logger=loggerFactory.CreateLogger();
}
//...
}
那太好了,谢谢你清理了它,因为它被键入了,这对传递给我的TraderService
的记录器有任何影响吗?@MatthewFlynn假设TraderService
要求ILogger
,并且不希望通过DI容器解决,它应该可以正常工作。谢谢你的帮助。@MatthewFlynn我很好奇为什么它是显式创建的,而不是注入到控制器中。对不起,你能稍微扩展一下吗?我是不是处理错了?如果有更好的方法,那就是一个绿地项目,这样我可以改变它
public class TraderService : ITraderService {
private readonly ILogger logger;
public TraderService(Func<IBemfeitoDataContext> context, ILogger logger) {
this.logger = logger;
//...
}
//...code removed for brevity
}
public class TraderService : ITraderService {
private readonly ILogger logger;
public TraderService(Func<IBemfeitoDataContext> context, ILogger<TraderService> logger) {
this.logger = logger;
//...
}
//...code removed for brevity
}
[Route("api/[controller]")]
public class TraderController : Controller {
private readonly ITraderService service;
private readonly ILogger logger;
public TraderController(ITraderService service, ILogger<TraderController> logger) {
this.service = service;
this.logger = logger;
}
//...
}
[Route("api/[controller]")]
public class TraderController : Controller {
private readonly ITraderService service;
private readonly ILogger logger;
public TraderController(ITraderService service, ILoggerFactory loggerFactory)
{
this.service = service;
this.logger = loggerFactory.CreateLogger<TraderController>();
}
//...
}