ASP	.NET	Core	hands-on
Andrea	Saltarello
Enos	Recanati
Prossima	fermata:	App	Day	(24/2/2017)
• HTTP,	ovvero	"Non	avrai	alcun	protocollo	al	di	fuori	di	me"	(45	min)	-
Speaker:	Andrea	Saltarello
• Xamarin (60	min)	- Speaker:	Corrado	Cavalli
• Implementare	il	backend con	ASP.NET	(45	min)	- Speaker:	Andrea	Saltarello
• Azure API	(60	min)	- Speaker:	Lorenzo	Barbieri
• The	next phase of	UX:	conversational (45	min)	- Speaker:	Elisabetta	Schiatti
• App	e	Privacy:	aspetti	specifici	della	normativa,	tra	presente	e	(prossimo)	
futuro	(45	min)	- Speaker:	Andrea	Palumbo
• More	to	come,	stay	tuned J
Talk.About();
• Anatomia	di	una	applicazione	ASP.NET	Core
• Architettura	di	ASP.NET	Core
• MVC	Core
ASP.NET	Core	at	a	glance
La	Dev story:	gli	editor
Per	sviluppare,	abbiamo	varie	opzioni:
1. Supporto	per:	Sublime,	Atom,	Emacs,	Vim	e	Brackets
2. Solo	supporto xproj
3. macOS:	solo	csproj;	Windows:	xproj per	v2015,	csproj per	v2017
Linux macOS Windows
CLI	+	OmniSharp¹ solo	.NET	Core solo	.NET	Core solo	.NET	Core
Xamarin Studio solo	.NET	Core²
Visual	Studio	Code solo	.NET	Core solo	.NET	Core X
Visual	Studio³ solo	.NET	Core X
La	Dev	story:	il	deploy
• (ASP).NET	Core	è	distribuito	in	due	versioni:
• LTS:	supportate	per	3	anni	*o*	per	1	anno	dopo	il	rilascio	della	LTS	successiva.	L’attuale	
versione	LTS	è	la	1.0.3
• Current:	supportate,	all’interno	della	corrispettiva	LTS,	per	3	mesi	a	partire	dal	rilascio	
della	«current»	successiva
Sono	tutte	disponibili	qui.
• .NET	Core	only:	
• il	deploy permette	sia	di	usare	l’installazione	del	FX	a	livello	di	macchina,	sia	una	locale	
alla	applicazione
• non	esistono	drop	release,	tutte	le	versioni	sono	installate	side-by-side
[	https://www.microsoft.com/net/core/support ]
Anatomia	di	una	applicazione	ASP.NET	Core
Una	applicazione	ASP.NET	Core:	
• Può	«girare»	sia	su	.NET	Core	sia	su	.NET	Framework
• Limitatamente	a	.NET	Core,	può	essere	sviluppata	su:	Linux,	macOS,	
Windows
• È	una	«normale»	applicazione	console	“ospitata”	da	un	server	e	
configurata	mediante	codice
demo
Dev	Story
Una	«normale»	applicazione	Console…
…ospitata	da	un	server…
• Sono	i	«container»:	ASP.NET	Core	fornisce	i	seguenti:
• Kestrel	(managed,	xplat)
• WebListener	(httpsys,	1.1+)
…e	configurata	mediante	codice
Per	configurare	una	applicazione	usiamo:
• project.json per	specificare	le	reference,	da	VS	2017/Mac	GA	in	poi	ye
olde csproj
• Startup.cs (o	omologa)	per	configurare	i	middleware
1. ConfigureServices()
2. Configure()
• [OPT] appsettings.json per	«informazioni»	di	configurazione
• ASPNETCORE_ENVIRONMENT
Middleware
Sono	funzioni che:
• implementano	la	delegate	RequestDelegate
• vengono	aggiunti	alla	request pipeline	di	ASP.NET	Core	mediante	i	metodi	
Map*,	Run e	Use*	di	IApplicationBuilder
public	void Configure(IApplicationBuilder app,	IHostingEnvironment env,	ILoggerFactory loggerFactory)
{
app.Run(async (context)	=>
{
await	context.Response.WriteAsync("Hello	World!");
});
}
demo
Middleware
Middleware
ASP.NET	Core	fornisce	out	of	the	box	alcuni	middleware,	tra	i	quali:
• Identity
• MVC
• ResponseCaching (1.1+)
• ResponseCompression (1.1+)
• Rewrite (1.1+)
Per	convenzione,	vengono	registrati in	ConfigureServices ed	attivati in	
Configure
[	https://blogs.msdn.microsoft.com/webdev/2016/11/16/announcing-asp-net-core-1-1/ ]
MVC
ASP.NET	MVC	Core
E’	il	middleware fornito	out	of	the	box	da	ASP.NET	Core	per	implementare	
applicazioni	basate	sulla	variante	Model	2 del	pattern	MVC	(quella	di	Struts,	
Rails,	Monorail,	…)
API	molto	simile	a	MVC	5	di	ASP.NET	4,	ma	con	alcune	differenze	strutturali:
• pipeline	MVC-WebAPI integrata
• supporto	a	controller	POCO
• dependency Resolver Injection
Per	vederlo	in	azione,	guardare	qui:	
http://www.ugidotnet.org/video/189329326/NET05--ASP-NET-MVC-Core-1
Talk.About();
• Routing
• Navigation Flow
• MVC
• Controller
• Razor
• Dependency Injection
P.S.:	demo	scaricabili	qui:	http://nsk.codeplex.com
Anatomia	di	un	URL
Dato	uno	URL,	ad	es:
http://www.sito.net/Customer/Detail/1
Il	routing engine di	ASP.NET:
• mappa	le	route verso	action/file
• effettua	il	parsing dello	URL	e	recupera	i	parametri
• Può	essere	configurato	per	supportare	route personalizzate
Introduzione	a	ASP.NET	MVC	(1/4)
http://www.sito.net/Customer/Detail/1
Introduzione	a	ASP.NET	MVC	(2/4)
http://www.sito.net/Customer/Detail/1
Introduzione	a	ASP.NET	MVC	(3/4)
http://www.sito.net/Customer/Detail/1
Introduzione	a	ASP.NET	MVC	(4/4)
http://www.sito.net/Customer/Detail/1
Controller
• Una	singola,	ed	opzionale,	classe	base:	
Microsoft.AspNet.Mvc.Controller
• Sono	Action	tutti	i	metodi	pubblici	di	un	controller.	
• Se	restituiscono:
• IActionResult,	il	“giro”	è	quello	di	MVC
• !=	IActionResult,	il	“giro”	è	quello	di	WebAPI (quindi	content
negotiation o	ProducesAttribute)
• Se	costruiamo	degli	helper,	decoriamoli	con	NonActionAttribute
Navigation	Flow
Le	action restituiscono	un	valore	di	tipo	IActionResult.	“Pragmapolimorficamente”	
parlando:
• ViewResult.	Restituito dal	metodo View
• PartialViewResult.	Restituito dal	metodo PartialView
• ContentResult.	Restituito dal	metodo Content
• JsonResult.	Restituito dal	metodo Json
• EmptyResult.	Restituito dalle action	che vogliano restituire “null”
• RedirectToRouteResult.	Restituito dai metodi RedirectToAction e	
RedirectToRoute
• RedirectResult.	Restituito dal	metodo Redirect
• YourOwnPersonalResult (semi-cit J);	esempi qui e	qui
demo
JSON
Custom	ActionResult
Razor view engine
Razor è	il	motore	di	rendering delle	view,	che:
• Sono	file	con	estensione	.cshtml
• Contengono	un	mix	di	markup	e	codice	C#
• Possono	essere	tipizzate
Una	view può	essere	visualizzata:
• indipendentemente
• all’interno	di	un	layout	
• all’interno	di	un’altra	view (Partial View,	Editor/Display	template)
All’interno	di	una	view abbiamo	accesso	agli	HTML	helper method
demo
Layout
POCO	Controller
Nessuna	classe	base;	può	essere	conveniente	dichiarare	ed	attivare:
• IUrlHelperFactory
• IActionContextAccessor
• public	ActionContext ActionContext {	get;	set;	}	*
• public	ViewDataDictionary ViewData {	get;	set;	}	*
*	Solo	con	container	di	terze	parti:
• https://github.com/aspnet/Mvc/issues/2151#issuecomment-104541719
• https://github.com/aspnet/Announcements/issues/28
demo
POCO	Controller
Tag	Helper
Sono	la	forma	“accatiemmellizzata”	degli	Helper method:
• Package	Microsoft.AspNet.Mvc.TagHelpers (o	cmq contenente	classi	derivate	da	TagHelper)
• @addTagHelper AssemblyName (es:	"Microsoft.AspNet.Mvc.TagHelpers")
• @removeTagHelper
• @tagHelperPrefix
• !
Possiamo	costruire	Tag	Helper custom	ereditando	la	classe	TagHelper
demo
_ViewImports.cshtml
Custom	TagHelper
Environment
Display/Editor	templates
I	Display/Editor	template:
• Permettono	di	“insegnare”	a	Razor come	renderizzare un	Data	Type
• Sono	partial view il	cui	nome	file	coincide	con	quello	del	data	type
(es:	DateTime.cshtml)
demo
Controller	(Logger)
View (EditorTemplate)
View Component
I	View Component:
• Sostituiscono	le	child action di	MVC	5	e	sono	simili	alle	partial view,	
ma	composti	da:
• Una	(o	più)	view
• Un	“light”	controller
• Si	usano	come	gli	helper method o,	dalla	versione	1.1	di	MVC	Core,	
con	una	sintassi	taghelper like
• Possono	essere	distribuiti	in	una	libreria	esterna	al	progetto:	
https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-
Monsters-Episode-52-Loading-View-Components-from-a-Class-Library
demo
ViewComponent
Aree
demo
Aree
Dependency	Injection
• Supportata	in	Controller,	Filtri,	View sostanzialmente	*dappertutto*
• Registrare	i	tipi	in	ConfigureServices,	indicando	lo	scope:
• AddInstance
• AddSingleton
• AddScoped
• AddTransient
• Esporre	le	dipendenze
• Ctor (Controller,	ViewComponent)
• Parametri	action:	FromServicesAttribute
• View:	@inject
• E’	possibile	sostituire	il	container	built in	con	uno	di	terze	parti:	
https://github.com/aspnet/DependencyInjection/blob/dev/README.md
grazie!
Feedback:	https://it.surveymonkey.com/r/B82FF5R
Materiale	su:	http://slideshare.net/ugidotnet
Demo
• NSK:	http://nsk.codeplex.com
• Merp:	http://www.github.com/mastreeno/merp

ASP .NET Core hands-on