2016-02-17 4 views
4

Я могу ввести ILogger в контроллер, но у меня возникла проблема с его введением в класс репозитория. Вот мой метод запуска:Лучший способ вставить Serilog в репозиторий для ведения журнала

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();} 

Это в моем методе Configure:

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; 

    } 

я могу вставить логгер в e, а затем передать его в репо, но должен быть способ непосредственно вставить регистратор в репо, но я не могу найти никаких примеров. Я могу создать другой экземпляр регистратора в репо, но это победит цель DI. У меня такая же проблема, как и с DBContext.

+1

Вы можете ввести _SkillsRepo_ в конструктор вашего контроллера. Цепочка DI автоматически добавит _DBContext_ и _Logger_ в SkillsRepo. В этом случае ваш SkillsRepo должен быть зарегистрирован в Startup.cs – Igor

+1

Спасибо Igor. Я смог заставить ваше предложение работать после того, как я добавил репо в ConfigureServices в классе Statup. services.AddScoped (); – forwheeler

ответ

-1

Ответ Игоря был решением с добавлением вашего репо к услугам, иначе вы получите сообщение об ошибке.

«Не удалось разрешить услугу типа»

+0

Просьба предоставить полное полное решение в вашем ответе. –

0

Как уже упоминалось вы должны зарегистрировать в инъекции в зависимости контейнер repository (DI) первым.

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

ILoggerFactory (и, следовательно, ILogger<T>) являются framework provided injections и не должны быть добавлены вручную.

Смежные вопросы