diff --git a/material-sistemas-distribuidos/src/css/code.css b/material-sistemas-distribuidos/src/css/code.css index 7706b33..be8c532 100644 --- a/material-sistemas-distribuidos/src/css/code.css +++ b/material-sistemas-distribuidos/src/css/code.css @@ -27,4 +27,6 @@ pre:has(code) { padding: 16px; border: 1px solid var(--color-codeblock-border); border-radius: 10px; + margin-top: var(--paragraph-spacing); + margin-bottom: var(--paragraph-spacing); } \ No newline at end of file diff --git a/material-sistemas-distribuidos/src/css/typography.css b/material-sistemas-distribuidos/src/css/typography.css index 382159e..3914bff 100644 --- a/material-sistemas-distribuidos/src/css/typography.css +++ b/material-sistemas-distribuidos/src/css/typography.css @@ -1,4 +1,6 @@ h1, h2, h3, h4, h5, h6 { + margin-top: var(--paragraph-spacing); + margin-bottom: var(--paragraph-spacing); font-family: var(--font-serif); } diff --git a/material-sistemas-distribuidos/src/routes/+layout.svelte b/material-sistemas-distribuidos/src/routes/+layout.svelte index 6e5a31e..e053406 100644 --- a/material-sistemas-distribuidos/src/routes/+layout.svelte +++ b/material-sistemas-distribuidos/src/routes/+layout.svelte @@ -8,9 +8,6 @@ import "../css/img.css"; import "../css/code.css"; - import hljs from "highlight.js/lib/core"; - import xml from "highlight.js/lib/languages/xml"; - let { children } = $props(); diff --git a/material-sistemas-distribuidos/src/routes/+page.svelte b/material-sistemas-distribuidos/src/routes/+page.svelte index b829d8d..597e9ec 100644 --- a/material-sistemas-distribuidos/src/routes/+page.svelte +++ b/material-sistemas-distribuidos/src/routes/+page.svelte @@ -1,5 +1,4 @@ @@ -32,6 +31,7 @@
  1. Criação do projeto
  2. Estrutura de arquivos
  3. +
  4. Criando e executando endpoints
  5. Conectando com o banco de dados
  6. Mantendo livros
  7. Emprestando livros
  8. diff --git a/material-sistemas-distribuidos/src/routes/endpoints/+page.svelte b/material-sistemas-distribuidos/src/routes/endpoints/+page.svelte new file mode 100644 index 0000000..7449e99 --- /dev/null +++ b/material-sistemas-distribuidos/src/routes/endpoints/+page.svelte @@ -0,0 +1 @@ +

    em desenvolvimento

    \ No newline at end of file diff --git a/material-sistemas-distribuidos/src/routes/estrutura_de_arquivos/+page.svelte b/material-sistemas-distribuidos/src/routes/estrutura_de_arquivos/+page.svelte index 6138331..22c59ba 100644 --- a/material-sistemas-distribuidos/src/routes/estrutura_de_arquivos/+page.svelte +++ b/material-sistemas-distribuidos/src/routes/estrutura_de_arquivos/+page.svelte @@ -1,21 +1,229 @@ -

    em desenvolvimento

    + -

    - Estes arquivos foram criados pelos comandos que você colou no terminal. - O primeiro comando cria um projeto do tipo webapi com o nome Biblioteca.WebApi. O segundo comando cria uma solução com o nome Biblioteca. - O terceiro comando adiciona o projeto Biblioteca.WebApi à solução Biblioteca. -

    + + Estrutura de arquivos + -

    - No dotnet, um arquivo de solução é um arquivo com extensão .sln que define uma coleção de projetos. Este arquivo é o ponto de entrada utilizado pela IDE para navegar pelo seu código e disponibilizar - as suas ferramentas, como o intellisense e o debugger. -

    +
    +

    Estrutura de arquivos

    -

    - Uma solução pode ter vários projetos, e é bem comum ver aplicações em dotnet que utilizam pelo menos dois. Mas não precisamos nos preocupar com isso agora. Apenas devemos criar uma solução para - fazer o VSCode ler o projeto corretamente. -

    +

    + O processo de criação do projeto gera todos os arquivos base que precisamos para começar a escrever uma API. Eles se dividem, basicamente, entre arquivos de configuração, de código fonte, e dos binários resultantes da compilação. +

    -

    - -

    \ No newline at end of file +

    + Os arquivos com extensão .cs são arquivos de código fonte em C#. Há um arquivo Program.cs que foi gerado automaticamente na criação do projeto, e que é o ponto de entrada da aplicação. + Ou seja, quando o projeto for executado, o conteúdo deste arquivo será o primeiro a ser executado (é o equivalente ao arquivo que contém public static void main(String[]) do Java, ou o int main() do C). + Além do Program.cs, você poderá estruturar o projeto criando vários arquivos .cs, cada um com classes diferentes. +

    + +

    + Já os arquivos .sln e .csproj definem, respectivamente, a solução e o arquivo de definição do projeto. +

    + +

    + Há diversos arquivos com extensão .json. Estes são arquivos de configuração utilizados para fins diversos, a depender do arquivo. +

    + +

    + Os diretórios bin/ e obj/ são criados automaticamente quando você compila o projeto (por exemplo, quando você executa o projeto pela IDE, ou através do comando dotnet run). + Por serem gerados automaticamente, estes diretórios podem ser apagados port você a qualquer momento. +

    + +

    + Vamos analisar com mais detalhes alguns destes arquivos base que foram gerados automaticamente: +

    + +
    +

    Biblioteca.sln

    + +

    + Este é o arquivo de solução. Uma solução é um "agrupamento de um ou mais projetos que trabalham juntos para criar uma aplicação". +

    + +

    + É bem comum vermos aplicações em .NET que utilizam dois ou mais projetos. Por exemplo, poderíamos criar um projeto Biblioteca.Core que teria toda a lógica da aplicação, um Biblioteca.WebApi que iria expor as APIs, e por fim um Biblioteca.Tests com testes unitários. + Como estamos trabalhando apenas com um projeto para deixar as coisas mais simples, nosso arquivo de solução somente terá referência à Biblioteca/Biblioteca.csproj. +

    + + +
    + +
    +

    + Biblioteca/Biblioteca.csproj +

    + +

    + Este arquivo define um projeto do .NET. Ele é escrito em uma sintaxe semelhante à do XML. Nele, variáveis sobre o projeto são configuradas. Por exemplo, a versão do .NET utilizada, opções de análise do compilador, além de referêncas à bibliotecas externas. +

    + +
    {`
    +  
    +    net9.0
    +    enable
    +    enable
    +  
    +
    +  
    +    
    +  
    +
    +`}
    + +

    + Este arquivo também é utilizado como referência pelo arquivo de solução. Ainda no exemplo dado anteriormente, se tivéssemos criado os três projetos, cada um deles teria, respectivamente, um arquivo + Biblioteca.Core.csproj, Biblioteca.WebApi.csproj e Biblioteca.Tests.csproj. Por sua vez, o arquivo Biblioteca.sln teria + uma referência a cada um deles. Desta forma, teríamos uma solução, com três projetos. +

    + + +
    + +
    + +
    + +
    +

    + Properties/launchSettings.json +

    + +

    + Este arquivo é um JSON que contém algumas configurações que definem o ambiente em que o projeto será executado. +

    + +
    {`{
    +  "$schema": "https://json.schemastore.org/launchsettings.json",
    +  "profiles": {
    +    "http": {
    +      "commandName": "Project",
    +      "dotnetRunMessages": true,
    +      "launchBrowser": false,
    +      "applicationUrl": "http://localhost:5000",
    +      "environmentVariables": {
    +        "ASPNETCORE_ENVIRONMENT": "Development"
    +      }
    +    },
    +    "https": {
    +      "commandName": "Project",
    +      "dotnetRunMessages": true,
    +      "launchBrowser": false,
    +      "applicationUrl": "https://localhost:7223;http://localhost:5000",
    +      "environmentVariables": {
    +        "ASPNETCORE_ENVIRONMENT": "Development"
    +      }
    +    }
    +  }
    +}`}
    + +

    + De todas estas configurações definidas neste arquivo, a mais importante e que devemos saber é a definição da porta em que a aplicação irá escutar as requisições. + Esta configuração é definida nas linhas "applicationUrl": "http://localhost:5000" e "applicationUrl": "https://localhost:7223;http://localhost:5000". +

    + +

    + Isto significa que a aplicação está configurada para escutar requisições HTTP na porta 5000, e HTTPS na porta 7223. Podemos ignorar a porta HTTPS, já que não a utilizaremos neste material. Porém, tenha em mente qual é a porta que está definida neste arquivo para o protocolo HTTP. +

    + + +
    + +
    +

    appsettings.json e appsettings.Development.json

    + +

    + Estes são arquivos JSON onde você pode adicionar variáveis de configuração que podem ser acessadas via código (por exemplo, chaves de conexão com banco de dados). +

    + +

    + Tanto appsettings.json quanto appsettings.Development.json tem exatamente o mesmo propósito, a diferença é que appsettings.Development.json é lido apenas quando a aplicação está no ambiente de desenvolvimento (Development), e as configurações que estão nele sobrescrevem as + que estão também presentes em appsettings.json (por exemplo, se nos dois arquivos há a configuração Connection String, o valor que está definido em appsettings.Development.json será o valor lido de fato). A separação destes arquivos é realizada para que possamos definir + valores diferentes para os ambientes de desenvolvimento e de produção (por exemplo, para definir uma chave de banco de dados de teste para o ambiente de desenvolvimento, e uma de um banco de dados de produção para o ambiente de produção). +

    + +

    + Nós não conseguiremos + enxergar esta diferença durante a escrita do nosso projeto, já que apenas estaremos no ambiente de desenvolvimento. Portanto, tanto faz se colocarmos nossas variáveis em um arquivo ou no outro. +

    + +
    {`{
    +  "Logging": {
    +    "LogLevel": {
    +      "Default": "Information",
    +      "Microsoft.AspNetCore": "Warning"
    +    }
    +  },
    +  "AllowedHosts": "*"
    +}`}
    + +

    + Todos os arquivos de configuração que vimos até aqui (Biblioteca.sln, Biblioteca.csproj e launchSettings.json) não precisam de nenhuma alteração da nossa parte, então nunca os editaremos. Já o appsettings.json será editado por nós, + futuramente, para configurarmos algumas variáveis para o acesso ao nosso banco de dados. +

    + + +
    + +
    +

    Biblioteca/Program.cs

    + +

    Enfim, um arquivo do C#. O Program.cs, como dito anteriormente, é o ponto de entrada da aplicação.

    + +
    {`var builder = WebApplication.CreateBuilder(args);
    +
    +...
    +
    +var app = builder.Build();
    +
    +...
    +
    +app.MapGet("/weatherforecast", () =>
    +{
    +    var forecast =  Enumerable.Range(1, 5).Select(index =>
    +        new WeatherForecast
    +        (
    +            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
    +            Random.Shared.Next(-20, 55),
    +            summaries[Random.Shared.Next(summaries.Length)]
    +        ))
    +        .ToArray();
    +    return forecast;
    +})
    +.WithName("GetWeatherForecast");
    +
    +app.Run();
    +
    +...`}
    + +

    + O conteúdo que foi gerado automaticamente na criação do projeto contém uma configuração inicial de um endpoint de exemplo. Na próxima seção, vamos começar a escrever código para criamos os endpoints para o escopo que definimos anteriormente. +

    +
    +
    + + \ No newline at end of file