Dependency injection 将Serilog注入存储库进行日志记录的最佳方法

Dependency injection 将Serilog注入存储库进行日志记录的最佳方法,dependency-injection,asp.net-core-mvc,Dependency Injection,Asp.net Core Mvc,我可以将ILogger注入控制器,但在尝试将其注入存储库类时遇到了问题。 以下是我的启动方法: public Startup(IHostingEnvironment env) { // Set up configuration sources. var builder = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddEnvi

我可以将ILogger注入控制器,但在尝试将其注入存储库类时遇到了问题。 以下是我的启动方法:

 public Startup(IHostingEnvironment env)
    {
        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddEnvironmentVariables();
        Configuration = builder.Build();

        Log.Logger = new LoggerConfiguration()
     .MinimumLevel.Error()
     .WriteTo.RollingFile(Path.Combine(
         env.WebRootPath, "log-{Date}.txt"))
     .CreateLogger();}
这在我的配置方法中:

   loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();
        loggerFactory.AddSerilog();
我的控制器:

 private readonly ISkillsRepo _repo;
    private readonly ILogger _logger;

    public HistoryAndReportsController(Context db, ILogger<SkillsRepo> logger)
    {
        _repo = new SkillsRepo(db, logger);
        _logger = logger;
    }
私有只读ISkillsRepo\u repo;
专用只读ILogger\u记录器;
公共历史记录和报告控制器(上下文数据库、ILogger记录器)
{
_repo=新技能repo(数据库、记录器);
_记录器=记录器;
}
回购协议:

  private readonly Context _db;
    private readonly ILogger _logger;
    public SkillsRepo(Context db, ILogger<SkillsRepo> logger)
    {
        _db = db;
        _logger = logger;

    }
private readonly Context\u db;
专用只读ILogger\u记录器;
public SkillsRepo(上下文数据库、ILogger记录器)
{
_db=db;
_记录器=记录器;
}
我可以将记录器注入控制器,然后将其传递给repo,但必须有一种方法将记录器直接注入repo,但我找不到任何示例。
我可以在repo中创建另一个记录器实例,但这违背了DI的目的。我在理解如何使用DBContext时也遇到了同样的问题。

Igor的答案是,解决方案是将您的回购添加到服务中,否则会出现错误


“无法解析类型的服务”

如前所述,您需要首先在依赖项注入(DI)容器中注册
存储库

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddScoped<IUserRepository, AwesomeUserRepository>();
        ...
    }
public void配置服务(IServiceCollection服务)
{
...
services.addScope();
...
}

ILogger工厂
(因此,
ILogger
)不需要手动添加。

您可以将SKILLSEPO注入控制器的构造函数中。DI链将自动将DBContext和Logger注入SkillsRepo。在这种情况下,需要在Startup.csThanks Igor中注册您的SkillsRepo。在我将repo添加到Statup类中的ConfigureServices之后,我能够得到您的建议。services.addScope();Igor如果您想将来自appsettings.json的字符串值传递给构造函数,注册在Startup类中会是什么样子?请在回答中提供完整的解决方案。