Как настроить поставщика журналов с внедрением зависимостей для библиотеки .NETC#

Место общения программистов C#
Ответить
Anonymous
 Как настроить поставщика журналов с внедрением зависимостей для библиотеки .NET

Сообщение Anonymous »

У меня есть типичный сценарий: я разрабатываю библиотеку .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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»