Asp.Net Core 1.0 Deep Dive

Preview:

Citation preview

#dotNetSpain2016

.NET Conference 2016Spain

#dotNetSpain2016

Eduard TomàsCompulsive Developeretomas@plainconcepts.com@eiximenis

ASP.NET 5 Deep Dive1.0 Core

Patrocinadores

Colaboradores

#dotNetSpain2016

#dotNetSpain2016

ConfiguraciónMVC6

Model BindingRoutingView ComponentsTag Helpers

Localización

Agenda

#dotNetSpain2016

Beer lover & makerEduard Tomàs

Proud fatherNerdy speaker

Compulsive DeveloperWorking @ Plain Concepts

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

¿O sí?

Configuración

#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

#dotNetSpain2016

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

Se puede inyectar la configuración

Configuración

#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

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Configuración

tipada2. Varios entornos

Model Binding

#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

#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”

#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”

#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

#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());}

#dotNetSpain2016

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

OutputFormatters

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Demos de binding

2. Custom model binder

Routing

#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

#dotNetSpain2016

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

Routing

#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

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Uso de IRoutes

2. Custom IRoute

#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...

#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

Talk is cheap…show me the code!

#dotNetSpain2016

”” 1. Convenciones

personalizadas

2. Constraints de acciones

View Components

#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

#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(...)

Tag Helpers

#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

#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

#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

#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

Localización

#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

#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

Q&A

#dotNetSpain2016

http://aka.ms/DOTNETT1S4

No olvides realizar la encuesta¡Gracias!

#dotNetSpain2016

Eduard TomàsCompulsive Developeretomas@plainconcepts.com@eiximenis http://aka.ms/DOTNETT1S4

Recommended