Это описано в документации для Serilog.Settings.Configuration
:
(Этот пакет реализует соглашение, использующее DependencyContext
для поиска любого пакета с Serilog
в любом местеname и извлекает из него методы конфигурации, поэтому приведенный выше пример Using
является избыточным.)
Это означает, что он используется для определения пакетов, используемых для поиска приемников Serilog, но он избыточен при использованииSerilog.Settings.Configuration
пакет.
Дополнительная информация
Я посмотрел исходный код Serilog, чтобы иметь возможность предоставить больше информации о точномчто делает Using
и зачем это вообще нужно.Я надеюсь, что следующее объяснение будет полезным.
Рассмотрим следующую установку на основе кода:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
В этом примере Console
- это метод расширения для LoggerSinkConfiguration
(и такпринимает в качестве первого параметра экземпляр LoggerSinkConfiguration
).При использовании этого подхода, основанного на коде, код будет компилироваться только в том случае, если этот метод расширения можно найти в указанной сборке.
Далее рассмотрим следующий подход, использующий подход на основе IConfiguration
:
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(someConfiguration)
.CreateLogger();
{
"Serilog": {
"Using": ["Serilog.Sinks.Console"], // Redundant.
"WriteTo": ["Console"]
}
}
В этом примере процесс компиляции не знает, к чему относится строковое значение JSON "Console"
, и поэтому существует необходимость в процессе, который может перейти от строки "Console"
кConsole()
метод расширения, упомянутый выше.Для этого Serilog должен сначала найти метод расширения во время выполнения (который в этом примере находится в сборке Serilog.Sinks.Console
).
Этот процесс поиска выполняется с использованием отражения, которое немного сканирует сборку, чтобы найти public static
методов, которые принимают в качестве своего первого параметра LoggerSinkConfiguration
.Директива Using
, о которой вы спрашивали в своем вопросе, - это механизм , помогающий точно определить, какие сборки следует сканировать при поиске этих методов расширения.
Как указано в документации,Подход на основе IConfiguration
использует DependencyContext
, чтобы автоматически сканировать сборки, в имени которых Serilog
.Поскольку Serilog.Sinks.Console
имеет в названии Serilog
, нет необходимости добавлять это в директиву Using
.У вас также есть возможность предоставить свой собственный DependencyContext
экземпляр при использовании этого подхода, поэтому вам может потребоваться указать, какие сборки нужно сканировать при поиске приемников.