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

Problema na importação dos produtos

Olá!

Estou com problemas em realizar a importação dos produtos. Tentei seguir alguns passos conforme a dúvidas neste fórum mas não consegui.

Quando executo o projeto ocorre o seguinte erro: System.InvalidOperationException: 'Unable to resolve service for type 'CasaDoCodigo.Repositories.ICategoriaRepository' while attempting to activate 'CasaDoCodigo.Repositories.ProdutoRepository'.'

Meu fonte estão da seguinte maneira.

Classe ProdutoRepository.cs

using CasaDoCodigo.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CasaDoCodigo.Repositories
{
    public class ProdutoRepository : BaseRepository<Produto>, IProdutoRepository
    {

        private readonly ICategoriaRepository categoriaRepository;

        public ProdutoRepository(ApplicationContext contexto, ICategoriaRepository categoriaRepository) : base(contexto)
        {
            this.categoriaRepository = categoriaRepository;
        }

        public IList<Produto> GetProdutos()
        {
            return dbSet.ToList();
        }

        public async Task SaveProdutos(List<Livro> livros)
        {
            foreach (var livro in livros)
            {
                if (!dbSet.Where(p => p.Codigo == livro.Codigo).Any())
                {
                    Categoria categoria = await categoriaRepository.NovaCategoria(livro.Categoria); //vai criar se necessário
                    dbSet.Add(new Produto(livro.Codigo, livro.Nome, livro.Preco, categoria));
                }
            }
            await contexto.SaveChangesAsync();
        }
    }

    public class Livro
    {
        public string Codigo { get; set; }
        public string Nome { get; set; }
        public string Categoria { get; set; }
        public string Subcategoria { get; set; }
        public decimal Preco { get; set; }
    }
}

Classe CategoriaRepository.cs

using CasaDoCodigo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CasaDoCodigo.Repositories
{
    public interface ICategoriaRepository
    {
        Task<Categoria> NovaCategoria(string nome);
    }

    public class CategoriaRepository : BaseRepository<Categoria>, ICategoriaRepository
    {
        public CategoriaRepository(ApplicationContext contexto) : base(contexto)
        {
        }

        public async Task<Categoria> NovaCategoria(string nome)
        {
            var categoriaDB = dbSet
                .Where(c => c.Nome == nome)
                .SingleOrDefault();

            if (categoriaDB == null)
            {
                var novaCategoria = new Categoria()
                {
                    Nome = nome
                };

                categoriaDB = dbSet.Add(novaCategoria).Entity;
            }

            await contexto.SaveChangesAsync();
            return categoriaDB;
        }
    }
}

Se preferir segue o projeto no github: https://github.com/cavalsilva/AluraNetJunior

Obrigado desde já.

Abraço.

3 respostas
solução!

Oi Ricardo, tudo bem?

Quando executo o projeto ocorre o seguinte erro: System.InvalidOperationException: 'Unable to resolve service for type 'CasaDoCodigo.Repositories.ICategoriaRepository' while attempting to activate 'CasaDoCodigo.Repositories.ProdutoRepository'.'

Isso acontece porque o construtor da classe ProdutoRepository tem um parâmetro do tipo (interface) ICategoriaRepository. Está faltando registrar no mecanismo de injeção de dependência do ASP.NET Core (método ConfigureServices da classe Startup.cs):

services.AddTransient<ICategoriaRepository, CategoriaRepository>();

Sem esse código, o mecanismo de injeção de dependência não sabe como criar uma instância da classe CategoriaRepository a partir da interface ICategoriaRepository.

Olá Marcelo! Tudo bem e com você?

Estarei fazendo isso amanhã pela manhã e estando ok marco aqui como resolvido.

Obrigado pelo feedback.

Grande abraço.

Olá Marcelo.

Obrigado! Funcionou perfeitamente.

Abraço.