2016-10-03 12 views
3

Я использую Serilog в своем приложении для ведения журнала. Когда я настройка регистратора, у меня есть такой код:Как передать зависимость Serilog Enricher?

var log = new LoggerConfiguration() 
    .Enrich.With<MySerilogEnricher>() 
    .ReadAppSettings() 
    .CreateLogger(); 

Я хочу, чтобы ввести некоторую зависимость в мой MySerilogEnricher класс, но когда я пытаюсь, я получаю эту ошибку компилятора:

error CS0310: 'SerilogEnricher' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TEnricher' in the generic type or method 'LoggerEnrichmentConfiguration.With()'

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

var instance = new MySerilogEnricher(myDependency); 
var log = new LoggerConfiguration() 
    .Enrich.WithInstance<MySerilogEnricher>(instance) 
    .ReadAppSettings() 
    .CreateLogger(); 

Есть ли способ передать зависимость к MySerilogEnricher? Возможно, у меня может быть класс с MySerilogEnricher и передать ему зависимость в свойстве, но это кажется беспорядочным.

ответ

4

Вы можете использовать метод .With() без родословной, чтобы передать экземпляр вашего обогатителя. Итак, в вашем примере это будет:

var instance = new MySerilogEnricher(myDependency); 
var log = new LoggerConfiguration() 
    .Enrich.With(instance) 
    .ReadAppSettings() 
    .CreateLogger(); 
+0

Но что, если моя зависимость не является синглом, допустим, это служба, зарегистрированная в контейнере с ограниченным сроком действия или временным временем жизни? –

+0

В этом конкретном примере, я думаю, вам потребуется Serilog для интеграции с вашим контейнером DI. Например, Serilog имеет интеграцию с Autofac: https://github.com/nblumhardt/autofac-serilog-integration – rmc00