【发布时间】:2018-05-29 15:11:06
【问题描述】:
看到一些奇怪的场景,当调用使用它的控制器时,我在 .NET Standard 2.0 CL 服务中遇到 DI 错误。
控制器
[Route("api/[controller]")]
public class VideoController : Controller
{
private readonly IVideoService _videoService;
public VideoController(IVideoService videoService)
{
_videoService = videoService;
}
[HttpGet("[action]")]
public List<Video> GetVideos()
{
return _videoService.GetVideos().Result.ToList();
}
}
CL 中的服务
public class VideoService : IVideoService
{
private readonly ILogger log;
private readonly ConfigWrapper config;
private readonly IAzureMediaServicesHelpers amsHelpers;
private readonly IStorageHelpers storageHelpers;
public VideoService(ILogger logger, ConfigWrapper _config, IAzureMediaServicesHelpers _amsHelper, IStorageHelpers _storageHelper)
{
log = logger;
config = _config;
amsHelpers = _amsHelper;
storageHelpers = _storageHelper;
}
在 .NET Core 项目中启动
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IStorageHelpers, StorageHelpers>();
services.AddTransient<IAzureMediaServicesHelpers, AzureMediaServicesHelpers>();
services.AddTransient<IVideoService, VideoService>();
services.AddMvc();
}
我得到的错误是典型的中间件异常
在尝试激活 Demo.Shared.VideoService' 时无法解析类型“Microsoft.Extensions.Logging.ILogger”的服务。
我这里没有使用 Logger,因为这个 CL 也被不支持 Logger 的 Azure Function 使用。我想我错过了一些简单的东西。
【问题讨论】:
-
您仍然需要告诉 DI 框架如何处理
ILogger。一个简单但笨拙的解决方案是创建一个 ILogger 的虚拟实现并使用它。 -
那会是什么样子?
-
这是你的代码,只有你能说出
ILogger的样子。 -
所以如果 ILogger(写我自己的 log.Error 等)我创建一个副本?我不能在某处注册 ILogger 的实例吗?
-
假设这是标准的 ASP.NET MVC Core
ILogger,那么应该已经有一个可供您使用...docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/…
标签: .net dependency-injection .net-core .net-standard