Reescrever ou migrar? É uma decisão difícil com qualquer nova tecnologia e você deseja tomar a decisão certa para qualquer aplicativo que será mantido nos próximos anos. Nesta sessão, você vai obter dicas preciosas para pegar sua aplicação ASP.NET MVC 5 e convertê-la para ASP.NET Core 2.x e aproveitar ao máximo as bibliotecas do .NET Standard.
3. DEVO MIGRAR PARA ASP.NET CORE
SE…
Desempenho é algo obrigatório (Kestrel delivers 7M req/sec)
Suporte multiplataforma é necessário
Ambiente Enterprise (muitas aplicações em mesmo server, diferentes frameworks, etc)
Se o update de 6 meses para Open Source é algo aceitável
Sua aplicação já é ASP.NET MVC, WebAPI, ou SignalR
4. NÃO MIGRAR PARA ASP.NET CORE
SE…
Você acha legal, novo ou só porque seus amigos estão usando
Sua aplicação precisa trabalhar com containers
Você precisa de Injeção de Dependência em todos os lugares
Você gosta de web.config
A sua aplicação funciona bem e entrega o que precisa para o seu negócio
5.
6.
7.
8.
9.
10. Visão da plataforma .NET atualmente
LIBRARIES
INFRASTRUCTURE
.NET STANDARD
DESKTOP WEB CLOUD MOBILE GAMING IoT AI
19. PREOCUPAÇÕES COM O
STARTUP.CS
Certifique-se de que o middleware para solicitações MVC/WebAPI esteja configurado corretamente
Revise e adicione configuração para:
o CORS – Cross-Origin Resource Sharing
o Global Exception Handling
o MVC Routing
o MVC / WebAPI Filters
o WebAPI Formatters
o Model Binders
o Areas
o Authentication
21. MANIPULAÇÃO DE EXCEPTIONS
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
22. FILTERS
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader",
"Resultado do filter adicionado para o GlobalHeader")); // uma instância
options.Filters.Add(typeof(SampleActionFilter)); // por type
options.Filters.Add(new SampleGlobalActionFilter()); // uma instância
});
services.AddScoped<AddHeaderFilterWithDi>();
}
23. FORMATTERS
public class VcardOutputFormatter : TextOutputFormatter
public class VcardInputFormatter : TextInputFormatter
services.AddMvc(options =>
{
options.InputFormatters.Insert(0, new VcardInputFormatter());
options.OutputFormatters.Insert(0, new VcardOutputFormatter());
});
24.
25. CRIE UM MIDDLEWARE
Software montado em um pipeline
Lida com solicitações e respostas,
BeginRequest e EndRequest
Sua classe Middleware deve manipular um
Delegate
26. MANIPULE O MIDDLEWARE
O manipulador processa a solicitação e entrega
RequestDelegate
Request
27. USANDO O NOVO MIDDLEWARE
app.UseMiddleware<MyMiddleware>();
app.MapWhen(
context =>
context.Request.Path.ToString().EndsWith(".report"),
appBranch => {
appBranch.UseMiddleware<MyHandlerMiddleware Handler>();
});
28.
29. INJEÇÃO DE DEPENDÊNCIA
INTEGRADA
Padrão DI nativo
Controle simples e eficiente em três escopos:
Transient: todos diferentes. Nova instância para todos controladores e serviços
Scoped: mesma instância para a mesma request, porém diferente em requests diferentes
Singleton: mesma instância. Para todos os objetos e requests
Startup.ConfigureServices ()
30.
31. COMPATIBILIDADE DA WEBAPI
Incluir o Microsoft.AspNetCore.Mvc.WebApiCompatShim para facilitar a
compatibilidade com o Web API 2.
O máximo que puder, sempre migre pra usar o [ApiController]
Se você estiver usando HttpResponseMessage em seus Web Api Controllers, você
precisará fazer uma pequena alteração de código na sua classe de inicialização para
chamar AddWebApiConventions().
services.AddMvc().AddWebApiConventions()
Dependendo de como você deseja fazer o roteamento com o Web API, talvez seja necessário
registrar as rotas para ele na sua classe de inicialização.
routes.MapWebApiRoute(name: "DefaultApi",
template: "api/{controller}/{id?}");
32.
33. ESTRATÉGIAS DE MIGRAÇÃO DAS
CONFIGURAÇÕES
Copie o conteúdo para appsettings.json
Migrar conteúdo para o Azure Key Vault
Refatore para usar o Configuration[“setting”]
Para uma transição suave use o pacote System.Configuration.ConfigurationManager
Não há necessidade de refatoração das configs e você traz todo o web.config
Não é compatível com Linux ou Mac
Deve estar sendo executado no IIS
37. PORTABILIDADE DO ENTITY
FRAMEWORK
Entity Framework 6.x é incompatível com o .NET Core
Solução: Rodar aplicações ASP.NET Core no .NET Framework
Restrição: roda apenas no Windows e IIS
Scaffold EF Core data-context from existing database
dotnet ef dbcontext scaffold “ConnectionString“
Microsoft.EntityFrameworkCore.SqlServer -o Model
38. SUPORTE DI PARA O DBCONTEXT
Configure seu DbContext no ConfigureServices
Adicione o novo construtor DbContextOptions
Aceite o contexto como parâmetro de entrada em Controllers, Views, etc
42. AUTENTICAÇÃO E AUTORIZAÇÃO
Comece usando o ASP.NET Core Identity
Não use sua própria solução de segurança
Use o scaffold do Identity 2.1 e personalize para corresponder aos seus objetos
anteriores.
43.
44. GERENCIANDO JAVASCRIPT/CSS COM
ASP.NET CORE
Adicione package.json/libman.json como referências aos seus pacotes
libman.json não depende do NodeJS
libman.json localiza arquivos conforme as instruções, o package.json requer outra etapa para implementar
os recursos
Use a extensão BunderMinifier ao invés do System.Web.Optimization
Procure o “MadsKristensen.BundlerMinifier” no Visual Studio Marketplace
Instale o pacote NuGet para o bundle on build – isso permitirá que compilações de
linha de comando sejam agrupadas
Preserve o bundleconfig.json
45.
46. MIGRANDO VIEWS
Razor é compatível com versões anteriores
Copie a pasta Views para dentro do novo projeto
Converta Views/web.config para Views/_ViewImports.cshtml
Converta namespaces.add para @using
Migre todas as configurações para a configurações centrais da aplicação
Scripts.Render e Styles.Render não existem
Troque as referencias de saída para o libman ou BundlerMinifier
47. RECURSOS PARA IR ALÉM
Documentação official de migração
https://aka.ms/aspnetmigrate21
Visual Studio Channel
https://twitch.tv/visualstudio
https://mixer.com/visualstudio
ASP.NET Blog
https://blogs.msdn.microsoft.com/webdev
.NET is an entire software development platform that takes care of a lot of the heavy lifting for you when you want to build an application. Applications frameworks help you build the specific types of apps or workloads and enable you to literally build any app for any platform with any operating system. Each .NET workload shares a common infrastructure and .NET Standard library. This means not only are your .NET skills portable, but your actual code is portable no matter what you’re building. This makes it easy to share reusable components (called libraries) across the breadth of applications people build.
Additionally, there are a broad set of development tools that makes it really productive to write, debug, build and manage code bases.
See: www.dot.net
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2
Transient: todos diferentes. Nova instância para todos controladores e serviços
Scoped: mesma instância para a mesma request, porém diferente em requests diferentes
Singleton: mesma instância. Para todos os objetos e requests
https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules?view=aspnetcore-2.2#migrating-to-the-new-httpcontextThis section shows how to translate the most commonly used properties of System.Web.HttpContext to the new Microsoft.AspNetCore.Http.HttpContext.