У меня есть типичный сценарий: я разрабатываю библиотеку .NET Core и хочу, чтобы вызывающее приложение могло дополнительно настраивать параметры ведения журнала.
В идеале я бы хотел используйте внедрение зависимостей в свойстве ILogger каждого класса в библиотеке. Чего я не могу понять, так это как инициализировать DI-контейнер в одной сборке, исполняемом файле приложения, и использовать его в другой, библиотечной сборке.
Лучшее, что я могу сделать: Можно придумать пример ниже, где DI-контейнер инициализируется в исполняемой сборке, а затем сохраняется в промежуточной сборке, к которой затем обращается библиотека. Мой вопрос: есть ли способ обойтись без промежуточной сборки И избежать необходимости загрязнять конструкторы библиотеки экземпляром журнала, который может понадобиться, а может и не понадобиться?
В надуманном примере ниже каждое пространство имен представляет собой отдельную сборку. Сборка библиотеки ничего не знает о сборке приложения.
using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Serilog;
namespace MainAssembly
{
class Program
{
public static Microsoft.Extensions.Logging.ILogger logger = NullLogger.Instance;
static void Main()
{
Console.WriteLine("DI + Log Test");
// Set up logging factory.
var loggerFactory = new LoggerFactory();
var serilogConfig = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Is(Serilog.Events.LogEventLevel.Debug)
.WriteTo.Console(outputTemplate: "{Timestamp:HH:mm:ss.fff} [{Level}] ({SourceContext}.{Method}) {Message}{NewLine}{Exception}")
.CreateLogger();
loggerFactory.AddSerilog(serilogConfig);
// Set up dependency injection services.
ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(loggerFactory);
IntermediaryAssembly.DI.ServicesSingleton = serviceCollection.BuildServiceProvider();
// Attempt to get a logger from the DI container.
logger = IntermediaryAssembly.DI.TryGetLogger();
logger.LogDebug("Logging initialised.");
var lib = new LibraryAssembly.DoIt();
lib.DoWork();
Console.WriteLine("Finished.");
}
}
}
namespace IntermediaryAssembly
{
public class DI
{
public static ServiceProvider ServicesSingleton;
public static ILogger TryGetLogger()
{
if (ServicesSingleton != null && ServicesSingleton.GetServices().Any())
{
return ServicesSingleton.GetRequiredService().CreateLogger();
}
else
{
return NullLogger.Instance;
}
}
}
}
namespace LibraryAssembly
{
public class DoIt
{
public Microsoft.Extensions.Logging.ILogger logger = NullLogger.Instance;
public DoIt()
{
// Attempt to get a logger from the DI container.
logger = IntermediaryAssembly.DI.TryGetLogger();
}
public void DoWork()
{
logger.LogDebug("Doing work...");
}
}
}
Использованные пакеты:
Подробнее здесь: https://stackoverflow.com/questions/638 ... et-library
Как настроить поставщика журналов с внедрением зависимостей для библиотеки .NET ⇐ C#
Место общения программистов C#
1732025110
Anonymous
У меня есть типичный сценарий: я разрабатываю библиотеку .NET Core и хочу, чтобы вызывающее приложение могло дополнительно настраивать параметры ведения журнала.
В идеале я бы хотел используйте внедрение зависимостей в свойстве ILogger каждого класса в библиотеке. Чего я не могу понять, так это как инициализировать DI-контейнер в одной сборке, исполняемом файле приложения, и использовать его в другой, библиотечной сборке.
Лучшее, что я могу сделать: Можно придумать пример ниже, где DI-контейнер инициализируется в исполняемой сборке, а затем сохраняется в [b]промежуточной[/b] сборке, к которой затем обращается библиотека. Мой вопрос: есть ли способ обойтись без [b]промежуточной[/b] сборки И избежать необходимости загрязнять конструкторы библиотеки экземпляром журнала, который может понадобиться, а может и не понадобиться?
В надуманном примере ниже каждое пространство имен представляет собой отдельную сборку. Сборка библиотеки ничего не знает о сборке приложения.
using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Serilog;
namespace MainAssembly
{
class Program
{
public static Microsoft.Extensions.Logging.ILogger logger = NullLogger.Instance;
static void Main()
{
Console.WriteLine("DI + Log Test");
// Set up logging factory.
var loggerFactory = new LoggerFactory();
var serilogConfig = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Is(Serilog.Events.LogEventLevel.Debug)
.WriteTo.Console(outputTemplate: "{Timestamp:HH:mm:ss.fff} [{Level}] ({SourceContext}.{Method}) {Message}{NewLine}{Exception}")
.CreateLogger();
loggerFactory.AddSerilog(serilogConfig);
// Set up dependency injection services.
ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(loggerFactory);
IntermediaryAssembly.DI.ServicesSingleton = serviceCollection.BuildServiceProvider();
// Attempt to get a logger from the DI container.
logger = IntermediaryAssembly.DI.TryGetLogger();
logger.LogDebug("Logging initialised.");
var lib = new LibraryAssembly.DoIt();
lib.DoWork();
Console.WriteLine("Finished.");
}
}
}
namespace IntermediaryAssembly
{
public class DI
{
public static ServiceProvider ServicesSingleton;
public static ILogger TryGetLogger()
{
if (ServicesSingleton != null && ServicesSingleton.GetServices().Any())
{
return ServicesSingleton.GetRequiredService().CreateLogger();
}
else
{
return NullLogger.Instance;
}
}
}
}
namespace LibraryAssembly
{
public class DoIt
{
public Microsoft.Extensions.Logging.ILogger logger = NullLogger.Instance;
public DoIt()
{
// Attempt to get a logger from the DI container.
logger = IntermediaryAssembly.DI.TryGetLogger();
}
public void DoWork()
{
logger.LogDebug("Doing work...");
}
}
}
Использованные пакеты:
Подробнее здесь: [url]https://stackoverflow.com/questions/63810762/how-to-configure-logging-provider-with-dependency-injection-for-net-library[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия