Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro ao tentar executar o código do exemplo da aula 03

Olá. Ao tentar executar o código do exemplo da aula 03, ocorreu um erro na linha

loggerFactory.AddProvider(SqlLoggerProvider.Create());

A mensagem é: "ILogProvider" não contém uma definição para AddProvider

Eu copiei o exemplo da explicação da aula.

5 respostas

Olá Luiz,

manda o código completo da sua classe Program e da SqlLoggerProvider para eu dar uma olhada, inclusive com os usings que pode ter faltado importar alguma coisa também.

Boa tarde Lucas. Obrigado pela ajuda.

Segue o código da classe Program:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace Alura.Loja.Testes.ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var contexto = new LojaContext()) {
                var produtos = contexto.Produtos.ToList();

                var serviceProvider = contexto.GetInfrastructure<IServiceProvider>();
                var loggerFactory = serviceProvider.GetService<ILoggerProvider>();
                loggerFactory.AddProvider(SqlLoggerProvider.Create());

                foreach (var item in produtos) {
                    Console.WriteLine(item);
                }

                Console.WriteLine("=================");
                foreach (var e in contexto.ChangeTracker.Entries()) {
                    Console.WriteLine(e.State);
                }

                var p1 = produtos.First();
                p1.Nome = "Harry Potter - Editado";

                Console.WriteLine("=================");
                foreach (var e in contexto.ChangeTracker.Entries()) {
                    Console.WriteLine(e.State);
                }

                contexto.SaveChanges();

                Console.WriteLine("=================");
                produtos = contexto.Produtos.ToList();
                foreach (var p in produtos) {
                    Console.WriteLine(p);
                }
            }
        }
    }
}

Classe SqlLoggerProvider:

using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.Logging;
using System;

namespace Alura.Loja.Testes.ConsoleApp {

    public class SqlLoggerProvider:ILoggerProvider {
        public static ILoggerProvider Create() {
            return new SqlLoggerProvider();
        }

        public ILogger CreateLogger(string categoryName) {
            if (categoryName == typeof(IRelationalCommandBuilderFactory).FullName) {
                return new SqlLogger();
            }
            return new NullLogger();
        }

        public void Dispose() {

        }
    }

    internal class NullLogger:ILogger {
        public IDisposable BeginScope<TState>(TState state) {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel) {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) {
            //não faz nada
        }
    }

    public class SqlLogger:ILogger {
        public IDisposable BeginScope<TState>(TState state) {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel) {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) {
            Console.WriteLine("");
            Console.WriteLine(formatter(state, exception));
            Console.WriteLine("");
        }
    }
}
solução!

Olá Luiz,

na linha em que está escrito

var loggerFactory = serviceProvider.GetService<ILoggerProvider>();

na verdade deveria ser ILoggerFactory ao invés de ILoggerProvider.

var loggerFactory = serviceProvider.GetService<ILoggerFactory>();

Boa tarde Lucas

A alteração funcionou. Obrigado.

Mas gostaria de avisar que há pequenos erros no código desse curso. Por exemplo:

Código da transcrição(não funciona):

private static void ExibeEntries(IEnumerable<EntityEntry> entries)
{
    Console.WriteLine("===================");
    foreach (var e in contexto.ChangeTracker.Entries())
    {
        Console.WriteLine(e);
    }
}

Código que está no vídeo (digitado pelo instrutor):

        private static void ExibeEntries(IEnumerable<EntityEntry> entries) {
            Console.WriteLine("===================");
            foreach (var e in entries) {
                Console.WriteLine(e.Entity.ToString() + " - " + e.State);
            }
        }

Abraços Luiz

Eu acabei arrumando lá no texto o código, de fato estava errado. Obrigado pelo feedback =]

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software