asp.net core 1.0 deep dive

41
#dotNetSpain2016 .NET Conference 2016 Spain

Upload: eduard-tomas

Post on 14-Apr-2017

835 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

.NET Conference 2016Spain

Page 2: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Eduard TomàsCompulsive [email protected]@eiximenis

ASP.NET 5 Deep Dive1.0 Core

Page 3: Asp.Net Core 1.0 Deep Dive

Patrocinadores

Colaboradores

#dotNetSpain2016

Page 4: Asp.Net Core 1.0 Deep Dive
Page 5: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

ConfiguraciónMVC6

Model BindingRoutingView ComponentsTag Helpers

Localización

Agenda

Page 6: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Beer lover & makerEduard Tomàs

Proud fatherNerdy speaker

Compulsive DeveloperWorking @ Plain Concepts

Page 7: Asp.Net Core 1.0 Deep Dive

¡Ojo!Los ejemplos están con rc1Es una RC… se supone que no habrá cambios en la RTM

¿O sí?

Page 8: Asp.Net Core 1.0 Deep Dive

Configuración

Page 9: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Múltiples OrígenesArchivos JSON, INI, XML, ...Argumentos de línea de comandosColecciones en memoria

Sensible al concepto de “entorno” (Dev, Prod, ...)

Configurable como pipeline

Configuración

Page 10: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Es muy fácil tener configuración tipada en clases POCO

Se puede inyectar la configuración

Configuración

Page 11: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Gestión de claves secretas (p. ej. Autenticación a servicios)

Las claves se guardan en local en cada máquina

Objetivo: Evitar subir claves a un repositorio

User Secrets

Page 12: Asp.Net Core 1.0 Deep Dive

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Configuración

tipada2. Varios entornos

Page 13: Asp.Net Core 1.0 Deep Dive

Model Binding

Page 14: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Mezcla del model binding existente en MVC5 y WebApi 2

Usando x-www-form-urlencoded tenemos el binding de MVC5

Usando otro content-type tenemos un binding parecido al de WebApi 2

Model Binding

Page 15: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Value Providers recogen datos de la peticiónNo están asignados a verbo HTTP.

Model binders, enlazan los datos a los parámetros

Guardados en diccionario <Type, IModelBinder>

Binding por defecto para parámetros, sean simples o complejos

Binding “a lo MVC”

Page 16: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Se aplica al único posible parámetro [FromBody]

Basado en formatters de entrada (IInputFormatter)

Cada formatter lee de un content-type especifico. OOB vienen:JsonInputFormatter – application/jsonXmlSerializerInputFormatter – application/xml (no registrado por defecto)XmlDataContractSerializerInputFormatter – application/xml

Binding “a lo WebApi”

Page 17: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

No todas los IActionResult aplican content-negotation

Deben heredar de ObjectResultSi se devuelve un tipo T que no sea un IActionResult el framework lo “envuelve” en un ObjectResult<T>

Basado en formatters de salida (IOutputFormatter)Atributo [Produces]

Content-Negotation

Page 18: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Generan la salida en función del tipo de datos que espera el cliente

Invocados por los ActionResult de negociación de contenido

Si no hay un formatter que pueda devolver el tipo de datos, el fallback es JSON

Output Formatters

services.AddMvc().Configure<MvcOptions>(options =>{    options.OutputFormatters.Insert(0, new HttpNotAcceptableOutputFormatter());}

Page 19: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

– JsonOutputFormatter– XmlSerializerOutputFormatter – No registrado por defecto– XmlDataContractSerializerOutputFormatter– TextPlainFormatter (cadenas a text/plain)– HttpNoContentOutputFormatter (null a 204)– HttpNotAcceptableOutputFormatter – (406 si no hay formatter)

OutputFormatters

Page 20: Asp.Net Core 1.0 Deep Dive

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Demos de binding

2. Custom model binder

Page 21: Asp.Net Core 1.0 Deep Dive

Routing

Page 22: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

En MVC5 y WebApi 2 hay dos tipos de Routing

Convention based (tabla de rutas centralizada)Convenciones distintas entre MVC5 y WebApi

Attribute based (basada en atributos)

En MVC6 existen esos dos mismos tiposRutas por atributo soportan [controller] y [action]

(Se refieren al controlador y acción actual)

Atributos a nivel de controlador y a nivel de acción

Routing

Page 23: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Route constraintsParámetros opcionalesParámetros con valor por defectoParámetros tipados

Routing

Page 24: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Los routers implementan IRouterCada router indica si puede procesar la petición (IsHandled)Routers built-in

TemplateRouteRouteCollection

Método extensión useRouter permite indicar un router a usar

MapRoute añade una TemplateRoute con el MvcDefaultHandler interno

Custom routers

Page 25: Asp.Net Core 1.0 Deep Dive

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Uso de IRoutes

2. Custom IRoute

Page 26: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

IApplicationModelConventionInterfaz definitivo para personalitzar como funciona MVC6... Y potencialmente romper otras cosas por el camino

Interfaz con un solo método (Apply). Dentro de este método recibimos un ApplicationModel con la información que usa MVC6 para modelizar la aplicación

Ejemplo: Podríamos crear una convención que enrute los métodos que empiecen por PostXXX usando... POST

Exacto! Enrutamiento a lo WebApi clásico ;-)

Un paso más...

Page 27: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Elemento de ApplicationModel que especifica requerimientos para que una acción sea válida.

Eso permite tener más de una acción bajo la misma ruta y usar otros elementos de la petición para seleccionar la acción final

Se aplican con atributos

IActionConstraintMetadata

Page 28: Asp.Net Core 1.0 Deep Dive

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Convenciones

personalizadas

2. Constraints de acciones

Page 29: Asp.Net Core 1.0 Deep Dive

View Components

Page 30: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Reemplazan a las vistas parciales de MVC5Puede verse un View Component como un “pequeño controlador”El VC tiene una única responsabilidad: devolver la vista parcial

Separación de responsabilidadesNo es necesario “hinchar” un controlador existente

View Components

Page 31: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

View ComponentsClase que herede de ViewComponentOpcional: Atributo [ViewComponent] para especificar nombre

Declarar método IViewComponentResult Invoke(…)

Crear la vista associadaEn /Views/Shared/<ViewComponent>/

Uso: @Component(“nombre”).Invoke(...)

Page 32: Asp.Net Core 1.0 Deep Dive

Tag Helpers

Page 33: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Permiten que una “etiqueta HTML” en una vista de Razor sea procesada en servidor

No son Web ControlsSustituyen a los helpers clásicos de Razor

Permiten una mayor integración con herramientas

Tag Helpers

Page 34: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Heredar de TagHelper

Decorar con [HtmlTargetElement] indicando qué atributos y qué tag son respondidos por el TagHelper

Redefinir el método Process

Creación de Tag Helpers

Page 35: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

La directiva addTagHelper “clase, assembly” importa el TagHelper indicado del ensamblado correspondiente

VS2015 incluye en _ViewImports.cshtml el código para importar todos los TagHelpers de MVC6 en todas las vistas:

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"

Importar Tag Helpers

Page 36: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Si un TagHelper es importado se ejecutará en todas las etiquetas HTML que coincidan con la etiqueta declarada en [HtmlTargetElement] siempre y cuando contengan algunos de los atributos declarados

Podemos preceder el nombre del tag con ! para indicar a Razor que no queremos que se procese el TagHelper

Podemos usar @tagHelperPrefix “prefijo” para forzar un prefijo para todos los TagHelpers.

Ejecución “selectiva” de Tag Helpers

Page 37: Asp.Net Core 1.0 Deep Dive

Localización

Page 38: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Nuevo middleware de localización

Soporta distintas fuentes (.resx, bbdd, ficheros texto)

Permite que el selector de cultura esté en headers (Accept-Language), en URL (query string) o en cookie

O en cualquier otro sitio que nosotros definamos

Localización

Page 39: Asp.Net Core 1.0 Deep Dive

#dotNetSpain2016

Objetos IRequestCultureProviders indican qué cultura utilizar a partir de los datos de la request

ObjetosIStringLocalizerFactory, IStringLocalizer para acceder a los recursos traducidos en las distintas fuentesIHtmlLocalizerFactory, IHtmlLocalizer ofrecen una API para acceder a los recursos traducidos para MVCIViewLocalizer es un IHtmlLocalizer especifico para la vista deseada

Localización

Page 40: Asp.Net Core 1.0 Deep Dive

Q&A

#dotNetSpain2016

http://aka.ms/DOTNETT1S4

Page 41: Asp.Net Core 1.0 Deep Dive

No olvides realizar la encuesta¡Gracias!

#dotNetSpain2016

Eduard TomàsCompulsive [email protected]@eiximenis http://aka.ms/DOTNETT1S4