O slideshow foi denunciado.

Introduzione ad ASP.NET Core

2

Compartilhar

Próximos SlideShares
ASP .NET Core hands-on
ASP .NET Core hands-on
Carregando em…3
×
1 de 32
1 de 32

Introduzione ad ASP.NET Core

2

Compartilhar

Descrição

Sessione presentata all'evento .NET Core Saturday a Pordenone il 22.10.2016

Transcrição

  1. 1. .NET Core Saturday 2016 – 22.10.2016 Introduzione ad ASP.NET Core Andrea Dottor Microsoft MVP ASP.NET @dottor
  2. 2. .NET Core Saturday 2016 – 22.10.2016 Chi sono Andrea Dottor ◇ Consulente e sviluppatore software ◇ Microsoft MVP ASP.NET ◇ presidente di XE – Development User Group ◇ email: andrea@dottor.net ◇ twitter: @dottor
  3. 3. .NET Core Saturday 2016 – 22.10.2016 Materiale ◇ Slide già disponibili su slideshare ■ http://www.slideshare.net/andreadottor ◇ Codice e slide a breve su ■ http://www.xedotnet.org/eventi/net-core-saturday/
  4. 4. .NET Core Saturday 2016 – 22.10.2016 Agenda ◇ Cos'è ASP.NET Core ◇ Perché ASP.NET Core ◇ Cambiamenti rispetto al passato ◇ Cosa c'è di nuovo
  5. 5. .NET Core Saturday 2016 – 22.10.2016 Cos'è ASP.NET Core ◇ E' l'ultima versione di ASP.NET ■ Chiamata in precedenza ASP.NET 5 ◇ Non si tratta di una evoluzione ma di una completa riscrittura ◇ Può essere utilizzato "sopra" al .NET Framework 4.6 (completo) permettendo il riutilizzo di librerie già in uso ◇ Può essere utilizzato "sopra" a .NET Core se vogliamo sfruttare le possibilità del multipiattaforma
  6. 6. .NET Core Saturday 2016 – 22.10.2016 Perché ASP.NET Core? ◇ ASP.NET Core is no longer based on System.Web.dll ■ Le funzionalità sono state scomposte in packages che racchiudono (molto spesso) una singola funzionalità ◇ New light-weight and modular HTTP request pipeline ■ Possibilità di referenziare solo le funzionalità che effettivamente verranno utilizzate ■ Possibilità di definire la pipeline ◇ Built on .NET Core, which supports true side-by-side app versioning ◇ bility to host on IIS or self-host in your own process ◇ Non si è più vincolati ad utilizzare Visual Studio come IDE di sviluppo
  7. 7. .NET Core Saturday 2016 – 22.10.2016 ASP.NET Core Releases ◇ 13 Settembre ASP.NET Core 1.0.1 (September 2016 Update) ◇ 27 Giugno ASP.NET Core 1.0.0 ◇ 16 Maggio ASP.NET Core RC2 ◇ 18 Novembre ASP.NET 5 RC1 ◇ … ◇ Visibili su github: ■ https://github.com/aspnet/home/releases
  8. 8. .NET Core Saturday 2016 – 22.10.2016 Togliamo subito alcuni dubbi [1] ◇ Supporto a Visual Basic .NET? ■ Non c'è ancora il supporto a Visual Basic .NET, ma arriverà. ■ E' presente nella roadmap pubblica su github ◇ Progetti esistenti fatti con MVC 5, si possono convertire? ■ No, non esiste alcun convertitore
  9. 9. .NET Core Saturday 2016 – 22.10.2016 Togliamo subito alcuni dubbi [2] ◇ .NET Framework o .NET Core? ■ .NET Framework è più maturo come tecnologia e permette di riutilizzare gran parte del codice scritto. Si è vincolati al solo SO Windows ■ .NET Core permette di utilizzare e referenziare le sole dll effettivamente utilizzate. Può girare su Linux, Windows e Mac. Le app possono essere pubblicate su Nano Server ◇ Alcuni dati sulle performance (febbraio 2016): ■ ASP.NET 4.6: <50k req/sec ■ ASP.NET Core (CLR): 400k req/sec ■ ASP.NET Core (.NET Core, Linux): 900k req/sec ■ ASP.NET Core (.NET Core, Windows): >1.1m req/sec ■ https://vimeo.com/172009499 ■ https://github.com/aspnet/benchmarks
  10. 10. .NET Core Saturday 2016 – 22.10.2016 Iniziamo a conoscere ASP.NET Core 3….2….1….si inizia
  11. 11. .NET Core Saturday 2016 – 22.10.2016 Struttura del progetto alcune differenze rispetto al passato ◇ Tutti i file statici vanno inseriti all'interno della cartella wwwroot ◇ Il file di progetto attualmente è il file json project.json ■ A breve verrà sostituito con una versione aggiornata del file csproj ◇ La configurazione custom di default è in un file appsettings.json ◇ Il file web.config è mantenuto solo configurazione del webserver
  12. 12. .NET Core Saturday 2016 – 22.10.2016 Application Startup ◇ L'entrypoint dell'applicazione è dato dalla classe Startup ◇ Metodo Configure: permette di configurare dettagliatamente come vogliamo sia composta la pipeline della nostra app ○ Definizione middleware da utilizzare ○ Definizione regole di routing ○ … ◇ Metodo ConfigureServices: permette di definire i servizi da utilizzare ■ Identity ■ MVC ■ Dependency Injection ■ …
  13. 13. .NET Core Saturday 2016 – 22.10.2016 Configurazione ◇ Non ci si basa più sul file web.config ◇ Possibilità di configurare l'applicativo da più tipologie di file di configurazione ◇ Uso di chiave-valore ■ Possibilità di mappare delle sezioni su nostre classi custom ◇ Vengono forniti alcuni extension-method per semplificare l'accesso ■ es: Configuration.GetConnectionString("DefaultConnection") è equivalente a: Configuration.GetSection("ConnectionStrings")["DefaultConnection"]
  14. 14. .NET Core Saturday 2016 – 22.10.2016 DEMO Struttura progetto
  15. 15. .NET Core Saturday 2016 – 22.10.2016 Un unico Controller ◇ Niente più differenza tra Web API e MVC ◇ Ereditano da Microsoft.AspNet.Mvc.Controller (ma anche no) ◇ Sono Action tutti i metodi pubblici del controller. ■ Se ritorniamo un IActionResult abbiamo lo stesso comportamento di una action MVC ■ Se non ritorniamo un IActionResult, si tratta di un metodo delle WebAPI (quindi content negotiation o ProducesAttribute) ◇ Usare NonActionAttribute per i metodi che non devono essere richiamabili direttamente
  16. 16. .NET Core Saturday 2016 – 22.10.2016 POCO Controller (Plain Old CLR Object) ◇ E' possibile definire classi controller che non ereditino da Controller ■ Non serve implementare interfacce o estendere classi basi ◇ Il nome della classe DEVE terminare con "Controller" ◇ NOTE: E' bene farsi passare tramite DI: IUrlHelperFactory e IActionContextAccessor
  17. 17. .NET Core Saturday 2016 – 22.10.2016 State migrando un progetto con WebAPI? ◇ Prestate attenzione agli oggetti ritornati in JSON in quanto il casing è cambiato! ■ In ASP.NET Core la serializzazione in JOSN usa il camelCasing per il nomi delle proprietà ■ In ASP.NET MVC fino alla versione 5, l'oggetto ritornata usava lo stesso casing del nome della proprietà ◇ Per mantenere il comportamento precedente: services.AddMvc() .AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); });
  18. 18. .NET Core Saturday 2016 – 22.10.2016 DEMO Controller
  19. 19. .NET Core Saturday 2016 – 22.10.2016 Tag helper ◇ HTML helper utilizzati come tag ◇ Estende/arricchisce i tag HTML con attributi che vegono eseguiti server-side ◇ Più facile personalizzare l’HTML ◇ Più facile lavorare in un editor HTML <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="UserName" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="UserName" class="form-control" /> <span asp-validation-for="UserName" class="text-danger"></span> </div> </div>
  20. 20. .NET Core Saturday 2016 – 22.10.2016 Custom Tag Helper ◇ Authoring Tag Helpers ■ https://docs.asp.net/en/latest/mvc/views/tag-helpers/authoring.html ◇ Chart Controls using TagHelpers & morris.js ■ http://en.xn--mgbz4cf.com/post/chart-controls-using-taghelpers--morrisjs ■ https://github.com/hishamco/ChartControls ◇ Tag-helper-samples ■ https://github.com/dpaquette/TagHelperSamples ■ https://www.nuget.org/packages/TagHelperSamples.Bootstrap
  21. 21. .NET Core Saturday 2016 – 22.10.2016 View Components ◇ Simili alle PartialView ◇ Composti da un proprio file di code-behind e view ■ Una classe di “code-behind” simile ad un mini controller. ○ Eredita da ViewComponent e richiede di implementare il metodo Invoke ■ Una view che ne definisce la visualizzazione ◇ Possono venire inclusi in una Class Library, facilitandone quindi il riutilizzo ■ https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-Monsters-Episode-52- Loading-View-Components-from-a-Class-Library @Component.Invoke("TagList")
  22. 22. .NET Core Saturday 2016 – 22.10.2016 DEMO Tag Helper e View Component
  23. 23. .NET Core Saturday 2016 – 22.10.2016 Dependency injection ◇ DI implementato out of the box. ◇ Possibilità di utilizzo del Container preferito (es: Autofac, Ninject, Unity, Windsor, …) ◇ Gestisce vari tipi di Lifestyle ■ Instance: Una nuova istanza viene creta ogni volta. Siamo noi a specificare come creare l’istanza (parametri nel costruttore). ■ Transient: Una nuova istanza viene creta ogni volta ■ Singleton: Viene creta una singola istanza, e viene ritornata sempre quella ■ Scoped: Viene creta un’istanza per ogni richiesta.
  24. 24. .NET Core Saturday 2016 – 22.10.2016 Dependency injection into views ◇ Possibilità di iniettare una classe/servizio all’interno delle View per poterne richiamare i metodi Come fare: ◇ Dichiarare il servizio in fase di Startup ■ services.AddTransient<TodoList.Services.StatisticsService>(); ◇ Nella view o nel file _ViewImports.cshtml utilizzare @inject ■ @inject TodoList.Services.StatisticsService Statistics ◇ Richiamare i metodi dalla view (supporto anche per async await) ■ @await Statistics.GetCount()
  25. 25. .NET Core Saturday 2016 – 22.10.2016 DEMO Dependency Injection
  26. 26. .NET Core Saturday 2016 – 22.10.2016 Managing Application State - Session ◇ Richiede che venga installato il package Microsoft.AspNetCore.Session ◇ Essendo construita sopra a IDistributedCache richiende anche il package Microsoft.Extensions.Caching.Memory ◇ Nel metodo ConfigureServices del file Startup, abilitarla richiamando: services.AddDistributedMemoryCache(); services.AddSession(options => { options.CookieName = ".DottorWeb.Session"; options.IdleTimeout = TimeSpan.FromSeconds(10); }); ◇ Nel metodo Configure del file Startup app.UseSession();
  27. 27. .NET Core Saturday 2016 – 22.10.2016 Usate il TempData? ◇ Il TempData fa uso della session, e quindi la dovete attivare! ◇ In ASP.NE Core 1.1 verrà introdotto un "Cookie-based TempData provider"
  28. 28. .NET Core Saturday 2016 – 22.10.2016 Roadmap ◇ 1.1 ■ URL Rewriting middleware ■ Response caching middleware ■ DI improvements for 3rd party containers ■ WebListener server (Windows only) ■ Middleware as MVC filters ■ ViewComponents as Tag Helpers ■ View precompilation ■ Cookie-based TempData provider ■ Improved Azure integration ◇ 1.2 ■ WebSockets ■ SignalR ■ Razor Pages (Views without MVC controllers) ■ Web API security
  29. 29. .NET Core Saturday 2016 – 22.10.2016 Nuovi tool in VS "15" ◇ New Template ■ 1 file di progetto ■ 1 file .cs ◇ New csproj Format
  30. 30. .NET Core Saturday 2016 – 22.10.2016 Corsi gratuiti - https://www.asp.net/free- courses
  31. 31. .NET Core Saturday 2016 – 22.10.2016 Domande?
  32. 32. .NET Core Saturday 2016 – 22.10.2016 Andrea Dottor ◇ Consulente e sviluppatore software ◇ Microsoft MVP ASP.NET ◇ presidente di XE – Development User Group ◇ email: andrea@dottor.net ◇ twitter: @dottor

Descrição

Sessione presentata all'evento .NET Core Saturday a Pordenone il 22.10.2016

Transcrição

  1. 1. .NET Core Saturday 2016 – 22.10.2016 Introduzione ad ASP.NET Core Andrea Dottor Microsoft MVP ASP.NET @dottor
  2. 2. .NET Core Saturday 2016 – 22.10.2016 Chi sono Andrea Dottor ◇ Consulente e sviluppatore software ◇ Microsoft MVP ASP.NET ◇ presidente di XE – Development User Group ◇ email: andrea@dottor.net ◇ twitter: @dottor
  3. 3. .NET Core Saturday 2016 – 22.10.2016 Materiale ◇ Slide già disponibili su slideshare ■ http://www.slideshare.net/andreadottor ◇ Codice e slide a breve su ■ http://www.xedotnet.org/eventi/net-core-saturday/
  4. 4. .NET Core Saturday 2016 – 22.10.2016 Agenda ◇ Cos'è ASP.NET Core ◇ Perché ASP.NET Core ◇ Cambiamenti rispetto al passato ◇ Cosa c'è di nuovo
  5. 5. .NET Core Saturday 2016 – 22.10.2016 Cos'è ASP.NET Core ◇ E' l'ultima versione di ASP.NET ■ Chiamata in precedenza ASP.NET 5 ◇ Non si tratta di una evoluzione ma di una completa riscrittura ◇ Può essere utilizzato "sopra" al .NET Framework 4.6 (completo) permettendo il riutilizzo di librerie già in uso ◇ Può essere utilizzato "sopra" a .NET Core se vogliamo sfruttare le possibilità del multipiattaforma
  6. 6. .NET Core Saturday 2016 – 22.10.2016 Perché ASP.NET Core? ◇ ASP.NET Core is no longer based on System.Web.dll ■ Le funzionalità sono state scomposte in packages che racchiudono (molto spesso) una singola funzionalità ◇ New light-weight and modular HTTP request pipeline ■ Possibilità di referenziare solo le funzionalità che effettivamente verranno utilizzate ■ Possibilità di definire la pipeline ◇ Built on .NET Core, which supports true side-by-side app versioning ◇ bility to host on IIS or self-host in your own process ◇ Non si è più vincolati ad utilizzare Visual Studio come IDE di sviluppo
  7. 7. .NET Core Saturday 2016 – 22.10.2016 ASP.NET Core Releases ◇ 13 Settembre ASP.NET Core 1.0.1 (September 2016 Update) ◇ 27 Giugno ASP.NET Core 1.0.0 ◇ 16 Maggio ASP.NET Core RC2 ◇ 18 Novembre ASP.NET 5 RC1 ◇ … ◇ Visibili su github: ■ https://github.com/aspnet/home/releases
  8. 8. .NET Core Saturday 2016 – 22.10.2016 Togliamo subito alcuni dubbi [1] ◇ Supporto a Visual Basic .NET? ■ Non c'è ancora il supporto a Visual Basic .NET, ma arriverà. ■ E' presente nella roadmap pubblica su github ◇ Progetti esistenti fatti con MVC 5, si possono convertire? ■ No, non esiste alcun convertitore
  9. 9. .NET Core Saturday 2016 – 22.10.2016 Togliamo subito alcuni dubbi [2] ◇ .NET Framework o .NET Core? ■ .NET Framework è più maturo come tecnologia e permette di riutilizzare gran parte del codice scritto. Si è vincolati al solo SO Windows ■ .NET Core permette di utilizzare e referenziare le sole dll effettivamente utilizzate. Può girare su Linux, Windows e Mac. Le app possono essere pubblicate su Nano Server ◇ Alcuni dati sulle performance (febbraio 2016): ■ ASP.NET 4.6: <50k req/sec ■ ASP.NET Core (CLR): 400k req/sec ■ ASP.NET Core (.NET Core, Linux): 900k req/sec ■ ASP.NET Core (.NET Core, Windows): >1.1m req/sec ■ https://vimeo.com/172009499 ■ https://github.com/aspnet/benchmarks
  10. 10. .NET Core Saturday 2016 – 22.10.2016 Iniziamo a conoscere ASP.NET Core 3….2….1….si inizia
  11. 11. .NET Core Saturday 2016 – 22.10.2016 Struttura del progetto alcune differenze rispetto al passato ◇ Tutti i file statici vanno inseriti all'interno della cartella wwwroot ◇ Il file di progetto attualmente è il file json project.json ■ A breve verrà sostituito con una versione aggiornata del file csproj ◇ La configurazione custom di default è in un file appsettings.json ◇ Il file web.config è mantenuto solo configurazione del webserver
  12. 12. .NET Core Saturday 2016 – 22.10.2016 Application Startup ◇ L'entrypoint dell'applicazione è dato dalla classe Startup ◇ Metodo Configure: permette di configurare dettagliatamente come vogliamo sia composta la pipeline della nostra app ○ Definizione middleware da utilizzare ○ Definizione regole di routing ○ … ◇ Metodo ConfigureServices: permette di definire i servizi da utilizzare ■ Identity ■ MVC ■ Dependency Injection ■ …
  13. 13. .NET Core Saturday 2016 – 22.10.2016 Configurazione ◇ Non ci si basa più sul file web.config ◇ Possibilità di configurare l'applicativo da più tipologie di file di configurazione ◇ Uso di chiave-valore ■ Possibilità di mappare delle sezioni su nostre classi custom ◇ Vengono forniti alcuni extension-method per semplificare l'accesso ■ es: Configuration.GetConnectionString("DefaultConnection") è equivalente a: Configuration.GetSection("ConnectionStrings")["DefaultConnection"]
  14. 14. .NET Core Saturday 2016 – 22.10.2016 DEMO Struttura progetto
  15. 15. .NET Core Saturday 2016 – 22.10.2016 Un unico Controller ◇ Niente più differenza tra Web API e MVC ◇ Ereditano da Microsoft.AspNet.Mvc.Controller (ma anche no) ◇ Sono Action tutti i metodi pubblici del controller. ■ Se ritorniamo un IActionResult abbiamo lo stesso comportamento di una action MVC ■ Se non ritorniamo un IActionResult, si tratta di un metodo delle WebAPI (quindi content negotiation o ProducesAttribute) ◇ Usare NonActionAttribute per i metodi che non devono essere richiamabili direttamente
  16. 16. .NET Core Saturday 2016 – 22.10.2016 POCO Controller (Plain Old CLR Object) ◇ E' possibile definire classi controller che non ereditino da Controller ■ Non serve implementare interfacce o estendere classi basi ◇ Il nome della classe DEVE terminare con "Controller" ◇ NOTE: E' bene farsi passare tramite DI: IUrlHelperFactory e IActionContextAccessor
  17. 17. .NET Core Saturday 2016 – 22.10.2016 State migrando un progetto con WebAPI? ◇ Prestate attenzione agli oggetti ritornati in JSON in quanto il casing è cambiato! ■ In ASP.NET Core la serializzazione in JOSN usa il camelCasing per il nomi delle proprietà ■ In ASP.NET MVC fino alla versione 5, l'oggetto ritornata usava lo stesso casing del nome della proprietà ◇ Per mantenere il comportamento precedente: services.AddMvc() .AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); });
  18. 18. .NET Core Saturday 2016 – 22.10.2016 DEMO Controller
  19. 19. .NET Core Saturday 2016 – 22.10.2016 Tag helper ◇ HTML helper utilizzati come tag ◇ Estende/arricchisce i tag HTML con attributi che vegono eseguiti server-side ◇ Più facile personalizzare l’HTML ◇ Più facile lavorare in un editor HTML <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="UserName" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="UserName" class="form-control" /> <span asp-validation-for="UserName" class="text-danger"></span> </div> </div>
  20. 20. .NET Core Saturday 2016 – 22.10.2016 Custom Tag Helper ◇ Authoring Tag Helpers ■ https://docs.asp.net/en/latest/mvc/views/tag-helpers/authoring.html ◇ Chart Controls using TagHelpers & morris.js ■ http://en.xn--mgbz4cf.com/post/chart-controls-using-taghelpers--morrisjs ■ https://github.com/hishamco/ChartControls ◇ Tag-helper-samples ■ https://github.com/dpaquette/TagHelperSamples ■ https://www.nuget.org/packages/TagHelperSamples.Bootstrap
  21. 21. .NET Core Saturday 2016 – 22.10.2016 View Components ◇ Simili alle PartialView ◇ Composti da un proprio file di code-behind e view ■ Una classe di “code-behind” simile ad un mini controller. ○ Eredita da ViewComponent e richiede di implementare il metodo Invoke ■ Una view che ne definisce la visualizzazione ◇ Possono venire inclusi in una Class Library, facilitandone quindi il riutilizzo ■ https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-Monsters-Episode-52- Loading-View-Components-from-a-Class-Library @Component.Invoke("TagList")
  22. 22. .NET Core Saturday 2016 – 22.10.2016 DEMO Tag Helper e View Component
  23. 23. .NET Core Saturday 2016 – 22.10.2016 Dependency injection ◇ DI implementato out of the box. ◇ Possibilità di utilizzo del Container preferito (es: Autofac, Ninject, Unity, Windsor, …) ◇ Gestisce vari tipi di Lifestyle ■ Instance: Una nuova istanza viene creta ogni volta. Siamo noi a specificare come creare l’istanza (parametri nel costruttore). ■ Transient: Una nuova istanza viene creta ogni volta ■ Singleton: Viene creta una singola istanza, e viene ritornata sempre quella ■ Scoped: Viene creta un’istanza per ogni richiesta.
  24. 24. .NET Core Saturday 2016 – 22.10.2016 Dependency injection into views ◇ Possibilità di iniettare una classe/servizio all’interno delle View per poterne richiamare i metodi Come fare: ◇ Dichiarare il servizio in fase di Startup ■ services.AddTransient<TodoList.Services.StatisticsService>(); ◇ Nella view o nel file _ViewImports.cshtml utilizzare @inject ■ @inject TodoList.Services.StatisticsService Statistics ◇ Richiamare i metodi dalla view (supporto anche per async await) ■ @await Statistics.GetCount()
  25. 25. .NET Core Saturday 2016 – 22.10.2016 DEMO Dependency Injection
  26. 26. .NET Core Saturday 2016 – 22.10.2016 Managing Application State - Session ◇ Richiede che venga installato il package Microsoft.AspNetCore.Session ◇ Essendo construita sopra a IDistributedCache richiende anche il package Microsoft.Extensions.Caching.Memory ◇ Nel metodo ConfigureServices del file Startup, abilitarla richiamando: services.AddDistributedMemoryCache(); services.AddSession(options => { options.CookieName = ".DottorWeb.Session"; options.IdleTimeout = TimeSpan.FromSeconds(10); }); ◇ Nel metodo Configure del file Startup app.UseSession();
  27. 27. .NET Core Saturday 2016 – 22.10.2016 Usate il TempData? ◇ Il TempData fa uso della session, e quindi la dovete attivare! ◇ In ASP.NE Core 1.1 verrà introdotto un "Cookie-based TempData provider"
  28. 28. .NET Core Saturday 2016 – 22.10.2016 Roadmap ◇ 1.1 ■ URL Rewriting middleware ■ Response caching middleware ■ DI improvements for 3rd party containers ■ WebListener server (Windows only) ■ Middleware as MVC filters ■ ViewComponents as Tag Helpers ■ View precompilation ■ Cookie-based TempData provider ■ Improved Azure integration ◇ 1.2 ■ WebSockets ■ SignalR ■ Razor Pages (Views without MVC controllers) ■ Web API security
  29. 29. .NET Core Saturday 2016 – 22.10.2016 Nuovi tool in VS "15" ◇ New Template ■ 1 file di progetto ■ 1 file .cs ◇ New csproj Format
  30. 30. .NET Core Saturday 2016 – 22.10.2016 Corsi gratuiti - https://www.asp.net/free- courses
  31. 31. .NET Core Saturday 2016 – 22.10.2016 Domande?
  32. 32. .NET Core Saturday 2016 – 22.10.2016 Andrea Dottor ◇ Consulente e sviluppatore software ◇ Microsoft MVP ASP.NET ◇ presidente di XE – Development User Group ◇ email: andrea@dottor.net ◇ twitter: @dottor

Mais Conteúdo rRelacionado

Audiolivros relacionados

Gratuito durante 30 dias do Scribd

Ver tudo

×