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

时间:2016-02-17 01:25:40

标签: dependency-injection asp.net-core-mvc

我可以将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;
    }

回购:

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

    }

我可以将记录器注入控制器,然后将其传递给回购,但必须有一种方法将记录器直接注入回购,但我找不到任何示例。 我可以在回购中创建另一个记录器实例,但这会破坏DI的目的。我有同样的问题,了解如何使用DBContext执行相同的操作。

2 个答案:

答案 0 :(得分:0)

如前所述,您需要先在依赖注入(DI)容器中注册repository

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddScoped<IUserRepository, AwesomeUserRepository>();
        ...
    }

ILoggerFactory(因此ILogger<T>)为framework provided injections,无需手动添加。

答案 1 :(得分:-1)

Igor的回答是解决方案,添加了您的回购添加到服务,否则您会收到错误。

&#34;无法解决类型&#34;

的服务