Не удалось разрешить ILogger из Microsoft.Extensions.Logging - PullRequest
0 голосов
/ 22 октября 2018

Я сконфигурировал Main моего консольного приложения так:

var services = new ServiceCollection()
                .AddLogging(logging => logging.AddConsole())
                .BuildServiceProvider();

И затем я пытаюсь использовать его в другом классе, например,

    private readonly ILogger _logger;

    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public void MyFunc()
    {
        _logger.Log(LogLevel.Error, "My Message");
    }

Система.InvalidOperationException: «Не удалось разрешить службу для типа« Microsoft.Extensions.Logging.ILogger »

Я пробовал решения здесь , но у меня это не сработало.

Редактировать Исходя из комментария Яакова ниже и этого комментария Github Я могу решить это правильно, выполнив

    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }

Я быЯ предпочел бы иметь это в начальном BuildServiceProvider, но похоже, что мне придется повторять это каждый раз, когда я хочу использовать регистратор (или создать свой собственный ILogger).

Ответы [ 2 ]

0 голосов
/ 21 августа 2019

ILogger больше не зарегистрирован по умолчанию, но ILogger есть.Если вы все еще хотите использовать ILogger, вы можете зарегистрировать его вручную с помощью следующего (Startup.cs):

    public void ConfigureServices(IServiceCollection services)
    {
        var serviceProvider = services.BuildServiceProvider();
        var logger = serviceProvider.GetService<ILogger<AnyClass>>();
        services.AddSingleton(typeof(ILogger), logger);
        ...
     }

Где AnyClass может быть чем-то общим, например:

     public class ApplicationLogs
     {
     }

Так:

        public void ConfigureServices(IServiceCollection services)
        {
            var serviceProvider = services.BuildServiceProvider();
            var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
            services.AddSingleton(typeof(ILogger), logger);
            ...
         }

Теперь ILogger будет разрешаться с помощью инжектора конструктора

0 голосов
/ 22 октября 2018

Я предполагаю, что вы используете шаблон по умолчанию для основного веб-приложения .net.
В ваших файлах Startup.cs у вас должен быть такой метод: ↓↓↓↓↓↓↓

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        //Do the service register here and extra stuff you want
         services.AddLogging(config =>
        {
            config.AddDebug();
            config.AddConsole();
            //etc
        });

    }

Редактировать: я написал простую программу для вас, чтобы показать, как она работает

public class MyClass
{

    private readonly ILogger<MyClass> _logger;


    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }
    public void MyFunc()
    {
        _logger.Log(LogLevel.Error, "My Message");
    }
}



public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection().AddLogging(logging => logging.AddConsole());
        services.AddSingleton<MyClass>();//Singleton or transient?!
        var s = services.BuildServiceProvider();
        var myclass = s.GetService<MyClass>();
     }
}

enter image description here Редактировать: Вывод программы: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...