10
respostas

[Dúvida] Finalizando o curso

Como posso integrar esse último projeto no feito anteriormente? Exemplo, nos cursos/aulas anteriores, desenvolvemos o ScreenSound, e nesse fizemos uma API pra ele. Como posso chamar esse projeto do inicialmente ScreenSound, e usá-lo como base de dados? Há algum outro curso para aprender isso?

10 respostas

Se eu entendi sua dúvida...

Você precisa compilar o seu projeto ScreenSound para o formato .dll, depois no seu outro projeto (API) que está numa outra solução, você precisaria adicionar uma referência para essa .dll. O Visual Studio te ajuda nisso, clica encima do projeto, adicionar referência e vai em 'procurar'. Depois é só usar no código declarando no cabeçalho "using ScreenSound" (algo assim, de acordo com o namespace).

Um contexto: Quando você utiliza no seu código 'using System.Text', 'using EntityFrameworkCore', 'using Dapper', ou qualquer tipo de 'using' você está chamando um outro projeto de formato dll.

Espero que tenha te ajudado

No caso, o ScreenSound é meu projeto principal, então não seria o ScreenSoundAPI que deveria ser compilado para ser utilizado, já que ele é a integração com a API?

E no caso, a dúvida, é como integrar o projeto da API como base de dados para o projeto principal.

Sim, poderia ser

Algum professor do Alura poderia me ajudar a resolver esse problema??

Depois de muito apanhar, consegui transformar o ScreenSoundAPI em uma dll e adicionar no projeto principal, mas não consigo usar os metódos, pois preciso passar a lista de musicas como parâmetros. Como posso fazer com que isso seja passado automaticamente na API, para não precisar passar como parâmetro, e assim conseguir usar os métodos? Afinal, quero usar a API como base de dados inicial.

Segue meu projeto: https://github.com/izaleme/ScreenSound

Bom dia Izabela, tudo bom?

Espero que sim. pelo que entendi seu objetivo é invocar os métodos da API na sua aplicação console, certo? Baixei seus projetos, um ponto de atenção importante é que os métodos que vc está invocando da dll são estáticos:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSendo assim a chamada deve ser assim:


        ScreenSoundAPI.Filters.LinqOrder csLinq = new ScreenSoundAPI.Filters.LinqOrder();
        //csLinq.ExibirMusicasOrdenadas();
        LinqOrder.ExibirArtistasOrdenados(musicas); //Como os métodos são todos estáticos sua classe "é estática"

Outro ponto importante é que ao passar a lista de músicas para o método validar os tipos, pois temos diferenças na classe Música do projeto console e da API, para testar no projeto console criei uma lista do tipo Música do projeto da API:

 public void Executar()
 {
     Console.Clear();
     ExibirTituloDaOpcao("Exibindo todas as músicas registradas na nossa aplicação");

     List<ScreenSoundAPI.Models.Musica> musicas = new List<ScreenSoundAPI.Models.Musica>
         {
             new ScreenSoundAPI.Models.Musica
             {
                 Nome = "Bohemian Rhapsody",
                 Artista = "Queen",
                 Duracao = 354000,
                 Genero = "Rock",
                 AnoString = "1975",
                 Key = 9
             },
             new ScreenSoundAPI.Models.Musica
             {
                 Nome = "Shape of You",
                 Artista = "Ed Sheeran",
                 Duracao = 263000,
                 Genero = "Pop",
                 AnoString = "2017",
                 Key = 6
             },
             new ScreenSoundAPI.Models.Musica
             {
                 Nome = "Hotel California",
                 Artista = "Eagles",
                 Duracao = 390000,
                 Genero = "Rock",
                 AnoString = "1976",
                 Key = 0
             },
             new ScreenSoundAPI.Models.Musica
             {
                 Nome = "Smells Like Teen Spirit",
                 Artista = "Nirvana",
                 Duracao = 301000,
                 Genero = "Grunge",
                 AnoString = "1991",
                 Key = 7
             },
             new ScreenSoundAPI.Models.Musica
             {
                 Nome = "Blinding Lights",
                 Artista = "The Weeknd",
                 Duracao = 200000,
                 Genero = "Synthpop",
                 AnoString = "2019",
                 Key = 10
             }
         };


     ScreenSoundAPI.Filters.LinqOrder csLinq = new ScreenSoundAPI.Filters.LinqOrder();
     //csLinq.ExibirMusicasOrdenadas();
     LinqOrder.ExibirArtistasOrdenados(musicas);

     Console.Write("\nAperte qualquer tecla para voltar ao menu principal...");
     Console.ReadKey();
     Console.Clear();
 }

Para testar no program.cs:

MenuMostrarMusicas teste = new MenuMostrarMusicas();
teste.Executar();

O resultado obtido:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Espero que ter conseguido ajudar, se ainda não estiver claro vamos conversando neste post!

Até.

Olá, obrigada pelo retorno e pela ajuda! Entendi o que você fez, obrigada pelas dicas, mas no fim não era isso que eu queria fazer.

O arquivo dll já possui uma lista de músicas, que ele pega pela API passada no curso. Eu queria que essas musicas da API, já tratadas na dll, fossem utilizadas como minha base de dados, sendo assim desnecessário eu ter que passar novas musicas para a dll.

O que vc passou funcionou, mas não consigo utilizar a base de dados já utilizada e tratada na API?

Bom dia Izabela, tudo bom?

É possível que sejam retornadas sim. Como está a classe na dll que retorna a lista de músicas?

Eu faço o seguinte para pegar os dados:

string resposta = await client.GetStringAsync("https://guilhermeonrails.github.io/api-csharp-songs/songs.json");
var musicas = JsonSerializer.Deserialize<List<Musica>>(resposta)!;

Mas não consigo utilizar, como posso pegar essas musicas da API, sem ter q passar de novo esse código no projeto principal? Eu preciso salvar elas local? Não posso continuar pegando pela API como esse projeto da API já está fazendo? Aliás, o link do repositório da API está no readme desse projeto principal... Obrigada pela ajuda até agora e aguardo retorno.

?????

Boa tarde Izabela, como vai?

Bom estou baixando o seu projeto novamente. Executando trecho de código:

string resposta = await client.GetStringAsync("https://guilhermeonrails.github.io/api-csharp-songs/songs.json");
var musicas = JsonSerializer.Deserialize<List<Musica>>(resposta)!;

Está dando erro na erro na conversão por o json https://guilhermeonrails.github.io/api-csharp-songs/songs.json quando convertido está diferente da classe música:

{
        "artist": "The Chainsmokers",
        "song": "#SELFIE - Original Mix",
        "duration_ms": 183750,
        "explicit": "False",
        "year": "2014",
        "popularity": "0",
        "danceability": "0.789",
        "energy": "0.915",
        "key": 0,
        "loudness": "-3.263",
        "mode": "1",
        "speechiness": "0.248",
        "acousticness": "0.0135",
        "instrumentalness": "8.77e-06",
        "liveness": "0.0818",
        "valence": "0.66",
        "tempo": "127.955",
        "genre": "pop, Dance/Electronic"
    }

Refatorei o código no exemplo abaixo:

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
    new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("applicatiob/json")
    );

HttpResponseMessage response = await client.GetAsync("https://guilhermeonrails.github.io/api-csharp-songs/songs.json");

var musicas = await response.Content.ReadFromJsonAsync<IEnumerable<Root>>();

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

Para o código executar defini uma classe que contem as props da arquivo songs.json:

public class Root
{
    public string artist { get; set; }
    public string song { get; set; }
    public int duration_ms { get; set; }
    public string @explicit { get; set; }
    public string year { get; set; }
    public string popularity { get; set; }
    public string danceability { get; set; }
    public string energy { get; set; }
    public int key { get; set; }
    public string loudness { get; set; }
    public string mode { get; set; }
    public string speechiness { get; set; }
    public string acousticness { get; set; }
    public string instrumentalness { get; set; }
    public string liveness { get; set; }
    public string valence { get; set; }
    public string tempo { get; set; }
    public string genre { get; set; }
}

Bom apartir do momento que você consegue recuperar as informações da API, ou da dll você pode salvar em uma base local sim.

Espero ter ajudado.