<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Diogo Kobbi</title>
    <description>The latest articles on DEV Community by Diogo Kobbi (@kobbi).</description>
    <link>https://dev.to/kobbi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F451382%2F728bd668-e27f-42e7-8e09-cc79541aaead.png</url>
      <title>DEV Community: Diogo Kobbi</title>
      <link>https://dev.to/kobbi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kobbi"/>
    <language>en</language>
    <item>
      <title>C# - Delegates (Parte 1)</title>
      <dc:creator>Diogo Kobbi</dc:creator>
      <pubDate>Tue, 18 Aug 2020 12:22:40 +0000</pubDate>
      <link>https://dev.to/kobbi/c-delegates-parte-1-5bob</link>
      <guid>https://dev.to/kobbi/c-delegates-parte-1-5bob</guid>
      <description>&lt;p&gt;De modo simplificado, podemos considerar delegates como objetos que sabem invocar métodos - ou métodos que são tratados como objetos, como preferir. É um tipo que representa uma referência a métodos com determinado tipo de retorno e parâmetros.&lt;/p&gt;

&lt;p&gt;Quando criamos uma instância de um delegate podemos associá-lo a qualquer método com assinatura compatível (retorno e parâmetros) e executá-lo mais tarde em nosso código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como criar e executar um delegate
&lt;/h3&gt;

&lt;p&gt;A declaração de um tipo delegate é similar a assinatura de um método. Ela tem um tipo de retorno e um ou mais parâmetros de diversos tipos:&lt;/p&gt;

&lt;p&gt;delegate  Identificador ([parâmetros])&lt;br&gt;
Após a criação, basta executar* o método usando o nome do objeto ou o método invoke:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;delegate&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;CalculoMatematico&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;Somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;valor1&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;CalculoMatematico&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Somar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;resultado1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;resultado2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;*Importante: em um projeto real é melhor verificar se o objeto é nulo antes de invocá-lo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action e Func
&lt;/h3&gt;

&lt;p&gt;Embora exista a possibilidade, nem sempre precisamos criar nossos próprios delegates. Também podemos utilizar os delegates Action e Func para agilizar nosso desenvolvimento. &lt;/p&gt;

&lt;p&gt;Em vez de especificarmos a assinatura do delegate para depois utilizá-lo como tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;delegate&lt;/span&gt; &lt;span class="nf"&gt;doubleCalculoMatematico&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;CalculoMatematico&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Somar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Podemos especificar na própria atribuição da variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Calculadora&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Somar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A diferença entre Action e Func é que um Action não retornará um valor, enquanto Func retornará um valor do tipo definido na declaração - ao declarar um Func, o último argumento sempre indicará o tipo de retorno (no exemplo acima, double será o tipo do retorno).&lt;/p&gt;

&lt;p&gt;Qual forma é melhor? Depende. Criar delegates nos permite controlar melhor o nosso código, pois o nome que damos ao delegate nos ajuda a entender sua função. As duas formas tem seus prós e contras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve um delegate?
&lt;/h3&gt;

&lt;p&gt;Um uso muito comum é utilizar delegates em métodos de callback - um método de callback é um pedaço de código executável que é passado como parâmetro para algum método, é esperado que o método execute o código do argumento em algum momento. Veja, por exemplo, a declaração do método Where da Classe Enumerable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TSource&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TSource&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TSource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;//Filtra uma sequência de valores baseado em um predicado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Este método recebe um delegate (Func) como parâmetro que retornará um valor do tipo falso ou verdadeiro, o que significa que podemos utilizá-lo da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;SaldoNegativo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;contas&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ContaCorrente&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;clientesUsandoChequeEspecial&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SaldoNegativo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ou criando uma função anônima (assunto para outro artigo) que tenha a mesma assinatura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;clientesUsandoChequeEspecial&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Saldo&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Veja que atribuir um método a uma variável e utilizá-la em outros trechos do código nos ajuda a manter o nosso código fortemente tipado, pois forçamos o uso da mesma assinatura e evitamos que um método totalmente fora do propósito seja executado. Afinal, se não obrigássemos que uma função específica fosse utilizada, outros desenvolvedores poderiam passar delegates incompatíveis e o filtro do método where não funcionaria corretamente, não é mesmo?&lt;/p&gt;

&lt;p&gt;No próximo artigo falarei sobre outros temas como Covariância, Multicast e Eventos, outro uso comum de delegates.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>delegates</category>
    </item>
    <item>
      <title>ASP.Net Core 3.0 - Conhecendo a plataforma</title>
      <dc:creator>Diogo Kobbi</dc:creator>
      <pubDate>Wed, 12 Aug 2020 13:33:14 +0000</pubDate>
      <link>https://dev.to/kobbi/asp-net-core-3-0-conhecendo-a-plataforma-2bj7</link>
      <guid>https://dev.to/kobbi/asp-net-core-3-0-conhecendo-a-plataforma-2bj7</guid>
      <description>&lt;p&gt;ASP.NET Core é um framework projetado para criação de aplicações conectadas a internet. Ele tem uma estrutura modular e pode ser dividido em uma plataforma para processar requisições HTTP, uma série de frameworks para criar diferentes tipos de aplicações, e frameworks auxiliares para enriquecer a aplicação com mais funcionalidades:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dny8UXAi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hpm894sd4u753nalntzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dny8UXAi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hpm894sd4u753nalntzw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fonte: Pro ASP.NET Core 3, Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages - Adam Freeman&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No ASP.Net Core os frameworks utilizados na criação das aplicações estão "separados" do resto da plataforma. Isso significa que, mesmo sendo o padrão mais utilizado, as aplicações ASP.Net Core não são obrigadas a utilizar o MVC. Podemos utilizar Razor Pages para criar websites, Blazor para criar SPA's e até mesmo desenvolver para IoT!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como uma aplicação ASP.Net Core funciona&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A plataforma possui diversos componentes, mas existem recursos chave que nos ajudam a entender melhor o mecanismo interno do ASP.Net Core: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;middlewares&lt;/li&gt;
&lt;li&gt;pipeline da requisição&lt;/li&gt;
&lt;li&gt;services. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nas aplicações conectadas as internet, uma resposta precisa ser gerada para atender uma requisição, e são estes componentes que farão boa parte do trabalho.&lt;br&gt;
Middlewares&lt;/p&gt;

&lt;p&gt;Quando uma requisição chega a aplicação, o ASP.Net Core cria um objeto que representa a requisição (context.request) e um objeto que representará sua resposta (context.response). Estes objetos são então passados a pedaços de software chamados middlewares para que sejam processados a fim de gerar a resposta desejada ao cliente.&lt;/p&gt;

&lt;p&gt;Middlewares podem ser funções anônimas ou classes. O ASP.Net Core possui diversos middlewares nativos que nos ajudam a resolver problemas comuns no desenvolvimento de aplicações conectadas a internet, mas também podemos criar novos middlewares a fim de atendermos requisitos específicos da nossa aplicação. O mais importante para nós neste momento é entender o papel que eles possuem na plataforma. Eles realizam sua tarefa com a requisição e em seguida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encaminham a requisição para o próximo middleware na "cadeia de processamento";&lt;/li&gt;
&lt;li&gt;interrompem a cadeia antecipadamente (em caso de erros, por exemplo);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Importante: se a resposta não for gerada por nenhum middleware, o ASP.Net Core retornará por padrão uma resposta HTTP 404 para o cliente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O pipeline da requisição&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Falamos em "cadeia de processamento" no tópico anterior pois no ASP.Net Core os middlewares são organizados em cadeia, e ficam responsáveis por "chamar" o próximo middleware para execução. Este conjunto de middlewares recebe o nome de request pipeline:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E9uzcebe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mnxtzhdcx60dggx20mt2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E9uzcebe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mnxtzhdcx60dggx20mt2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o ASP.Net Core temos total controle na criação deste pipeline, mas devemos estar atentos a ordem em que eles são configurados. O middleware que convoca fica aguardando a resposta do middleware que foi convocado, portanto, o primeiro middleware a receber a requisição será o último a receber a resposta. Essa sequência afeta o funcionamento  da aplicação e também pode impactuar sua segurança e performance.&lt;/p&gt;

&lt;p&gt;Agora que conhecemos o request pipeline, como seria a aplicação mais simples possível criada com ASP.Net Core?&lt;br&gt;
A aplicação mais simples é a que possui apenas um middleware para responder todas as requisições da aplicação. Veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Startup {   

    public void Configure(IApplicationBuilder app)    {       
        app.Run(async context =&amp;gt; {           
            await context.Response.WriteAsync("Hello, World!");       
        });   
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Neste aplicação, todos os clientes receberão o texto "Hello, World!" no corpo da resposta HTTP.&lt;br&gt;
Services&lt;/p&gt;

&lt;p&gt;Nem todos os componentes da aplicação precisam fazer parte do pipeline. Também precisamos de objetos que realizem cálculos, acessem bancos de dados, processem arquivos em disco, entre outras funcionalidades. Serviços no ASP.Net Core são estas dependências que utilizamos em nossa aplicação.&lt;/p&gt;

&lt;p&gt;Objetos interagem com outros objetos para cumprir determinada tarefas, e para dizer ao ASP.Net Core quais objetos desejamos utilizar, precisamos configurá-los como serviços em nossa aplicação. Por esta razão eles são um conceito chave nas aplicações ASP.Net Core. São eles que realizam uma parte fundamental do trabalho para que a resposta gerada corretamente para o cliente.&lt;/p&gt;

&lt;p&gt;A utilização de serviços trazem diversos benefícios. Ela evita a repetição de código, ajuda a manter o baixo acoplamento e nos permite seguir o princípio de Inversão do Controle (SOLID). Separamos estes códigos em serviços para que possam ser reutilizados dentro da aplicação ou até mesmo em outras aplicações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Juntando as peças&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Juntando todos as peças podemos visualizar melhor como o ASP.Net Core trabalha para atender todas as requisições dos clientes. Toda requisição recebida pela aplicação é encaminhada ao pipeline, onde cada middleware com a ajuda ou não de um ou mais services, processa e convoca o próximo middleware  na cadeia de processamento, até que a cadeia de processamento termine e gere a resposta final para o cliente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3JbT_ii1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8n7wxgn9t923hhivncbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3JbT_ii1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8n7wxgn9t923hhivncbl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fonte: Pro ASP.NET Core 3, Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages - Adam Freeman&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Curtiu? Siga o meu perfil para mais conteúdo sobre desenvolvimento .Net e C#. Bons estudos!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Pro-ASP-NET-Core-Cloud-Ready-Applications/dp/1484254392/ref=as_li_ss_tl?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;dchild=1&amp;amp;keywords=Pro+ASP.NET+Core+3,+Develop+Cloud-Ready+Web+Applications+Using+MVC,+Blazor,+and+Razor+Pages&amp;amp;qid=1597238389&amp;amp;sr=8-1&amp;amp;linkCode=ll1&amp;amp;tag=diogokobbi-20&amp;amp;linkId=ea7d8fd1897fa415d02cbd388c29a242&amp;amp;language=pt_BR"&gt;Pro ASP.NET Core 3, Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages - Adam Freeman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Programming-ASP-NET-Developer-Reference-English-ebook/dp/B07CVM27L9/ref=as_li_ss_tl?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;dchild=1&amp;amp;keywords=Programming+ASP.Net+Core+-+Dino+Esposito&amp;amp;qid=1597238586&amp;amp;sr=8-1&amp;amp;linkCode=ll1&amp;amp;tag=diogokobbi-20&amp;amp;linkId=405f6ea1dc58f7e5f79da70c77ab25f5&amp;amp;language=pt_BR"&gt;Programming ASP.Net Core - Dino Esposito&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/ASP-NET-Core-Action_p1-Andrew-Lock/dp/1617294616/ref=as_li_ss_tl?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;amp;dchild=1&amp;amp;keywords=ASP.Net+Core+in+Action+-+Andrew+Lock&amp;amp;qid=1597238611&amp;amp;sr=8-1&amp;amp;linkCode=ll1&amp;amp;tag=diogokobbi-20&amp;amp;linkId=a44f27f1dd7c4adc6c0a8b6d4d10bbf9&amp;amp;language=pt_BR"&gt;ASP.Net Core in Action - Andrew Lock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aspnetcore</category>
      <category>dotnetcore</category>
      <category>webdev</category>
      <category>middlewares</category>
    </item>
  </channel>
</rss>
