0

[Article] Novedades! Asp.Net 5 Preview 8

En el post anterior vimos las novedades que se encuentran disponibles en la preview 8 de .Net 5. Ahora le toca a Asp.Net 5, vemos.

Las novedades más importantes para esta preview son:

  • Autenticación de Azure Active Directory con Microsoft.Identity.Web
  • Aislamiento CSS para componentes Blazor
  • Carga diferida en Blazor WebAssembly
  • Se ha actualizado el soporte de globalización de Blazor WebAssembly
  • Nuevo componente InputRadio  en Blazor
  • Establecer foco en la interfaz de usuario en las aplicaciones de Blazor
  • Modificar los encabezados HTML en de Blazor
  • IAsyncDisposable para componentes Blazor
  • Controlar la creación de componentes de Blazor
  • Almacenamiento protegido del navegador
  • Enlace y validación de modelos con tipos de registro de C#
  • Mejoras en DynamicRouteValueTransformer
  • Actualización automática con reloj dotnet
  • Formador de registrador de consola
  • JSON Console Logger

Actualizar un proyecto existente

Si estábamos trabajando con la preview 7 y queremos actualizar a la preview 8 debemos hacer los siguiente:

  • Actualizar las referencias de los paquetes Microsoft.AspNetCore.* a  5.0.0-preview.8.*.
  • Actualizar todas las referencias del paquete Microsoft.Extensions.* a 5.0.0-preview.8.*.
  • Actualizar las referencias del paquete System.Net.Http.Json a 5.0.0-preview.8.*.

Novedades

Autenticación de Azure Active Directory con Microsoft.Identity.Web

Desde las plantillas de proyecto ASP.Net ahora se integran Microsoft.Identity.Web para controlar la autenticación con Azure AD. Este paquete proporciona una experiencia mejorada para la autenticación a través de AzureAD.

Aislamiento CSS para componentes Blazor

Blazor admite la declaración de estilos a nivel componentes para no interferir con los estilos globales dando resultados inesperados. Estos deben hacerse en un archivo específico, {nombre},razor.css que coincide con el el nombre del archivo correspondiente del componente

MyComponent.razor

<h1>My Component</h1>

<ul class="cool-list">
    <li>Item1</li>
    <li>Item2</li>
</ul>

MyComponent.razor.css

h1 {
    font-family: 'Comic Sans MS'
}

.cool-list li {
    color: red;
}

Estos estilos de MyComponent.razor.css  solo se aplicarán a la salida representada de MyComponent; los elementos h1  en otros componentes no se verán afectados.

Para escribir un selector en estilos específicos de componentes que afectan a los componentes secundarios, utilizaremos ::deep.

.parent ::deep .child {
    color: red;
}

Blazor aislará el CSS reescribiendo los selectores CSS como parte de la compilación para que coincidan con el ámbito del componente. A continuación, Blazor agrupara los archivos CSS reescritos y dejará el paquete a disposición de la aplicación como un recurso web estático en la ruta de acceso _framework/scoped.styles.css.

Por ahora, Blazor no admite de forma nativa preprocesadores CSS como Sass o Less, pero usar preprocesadores CSS para generar estilos específicos de componentes antes de que se vuelvan a escribir como parte de la compilación del proyecto.

Carga diferida en Blazor WebAssembly

Permite mejorar el tiempo de carga de la aplicación Blazor WebAssembly dejando que la descarga de dependencias de aplicaciones específicas hasta que sean necesarias. 

Para utilizarlos, debemos agregar al grupo de elementos BlazorWebAssemblyLazyLoad en el archivo de proyecto: La aplicación cargará explícitamente los ensamblados marcados para la carga diferida antes de que se usen. En tiempo de ejecución debemos utilizar el servicio  LazyAssemblyLoader:

@inject LazyAssemblyLoader LazyAssemblyLoader

@code {
    var assemblies = await LazyAssemblyLoader.LoadAssembliesAsync(new string[] { "Lib1.dll" });
}

Si deseamos hacerlo para una pagina especifica debemos usar los eventos OnNavigateAsync  en el componente Router.  En este evento se desencadena en todas las navegaciones de página y se puede usar para cargar de forma diferida los ensamblados de una ruta determinada. También podemos cargar con LazyLoad toda la página de una ruta pasando los ensamblados cargados difericos como ensamblados adicionales al enrutador.

@using System.Reflection
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@inject LazyAssemblyLoader LazyAssemblyLoader

<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="lazyLoadedAssemblies" OnNavigateAsync="@OnNavigateAsync">
    <Navigating>
        <div>
            <p>Loading the requested page...</p>
        </div>
    </Navigating>
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="typeof(MainLayout)" />
    </Found>
    <NotFound>
        <LayoutView Layout="typeof(MainLayout)">
            <p>Sorry, there is nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

@code {
    private List<Assembly> lazyLoadedAssemblies = 
        new List<Assembly>();

    private async Task OnNavigateAsync(NavigationContext args)
    {
        if (args.Path.EndsWith("/page1"))
        {
            var assemblies = await LazyAssemblyLoader.LoadAssembliesAsync(new string[] { "Lib1.dll"  });
            lazyLoadedAssemblies.AddRange(assemblies);
        }
    }
}

Aztualización en el soporte de globalización de Blazor WebAssembly

En esta preview se mejora la compatibilidad de globalización para Blazor WebAssembly basada en componentes internacionales para Unicode (ICU). El objetivo es optimizar estas cargas útiles para disminuir el tamaño de descarga. Todavía no se encuentra completo, pero, el equipo sigue trabajando en ello. 

Nuevo componente InputRadio  Blazor

Tenemos disponibles los componentes InputRadioInputRadioGroup  integrados simplifican el enlace de datos a grupos de botones de opción con validación integrada junto a los otros componentes de entrada de formulario para Blazor.

<InputRadioGroup @bind-Value="survey.OpinionAboutBlazor">
    @foreach (var opinion in opinions)
    {
        <div class="form-check">
            <InputRadio class="form-check-input" id="@opinion.id" Value="@opinion.id" />
            <label class="form-check-label" for="@opinion.id">@opinion.label</label>
        </div>
    }
</InputRadioGroup>

Foco en las aplicaciones de Blazor

Blazor tiene un método disponible un nuevo método FocusAsync en ElementReference  para establecer el foco de la interfaz de usuario en ese elemento

<botón de onclickonclická"() >  textInput.FocusAsync()">Establecer enfoque</botón>
<input árefá"textInput"/>

IAsyncDisposable para componentes Blazor

Los componentes admiten la interfaz IAsyncDisposable  para la versión asincrónica de los recursos asignados.

Controlar la creación de componentes de Blazor

Mladen Macanovic contribuyó para que esta funcionalidad esté disponible. Ahora podemos controlar cómo se crean instancias de los componentes proporcionando su propia implementación del servicio IComponentActivator.

Modificar los encabezados HTML en de Blazor

Tenemos los nuevos componentes: Title,  Link y  Meta.  Son útiles para establecer en tiempo de programación el título de una página, agregar dinámicamente vínculos  y  metaetiquetas  al encabezado HTML en una aplicación blazor.

Pasos:

  • Agregar una referencia de paquete al paquete Microsoft.AspNetCore.Components.Web.Extensions.
  • Incluir una referencia de script a _content/Microsoft.AspNetCore.Components.Web.Extensions/headManager.js.
  • Agregar una directiva @using  para  Microsoft.AspNetCore.Components.Web.Extensions.Head.
@if (unreadNotificationsCount > 0)
{
    var title = $"Notifications ({unreadNotificationsCount})";
    <Title Value="title"></Title>
    <Link rel="icon" href="icon-unread.ico" />
}

Almacenamiento protegido del navegador

Blazor en .NET 5 resuelve el problema de guardar información del lado del cliente con la posibilidad de ser alterada. Para esto tenemos dos nuevos servicios: ProtectedLocalStorage  y  ProtectedSessionStorage. Estos servicios nos ayudan a almacenar nuestros valores como el estado en el almacenamiento local y de sesión, respectivamente, y se encargaran de proteger los datos almacenados mediante las API de protección de datos ASP.NET Core.

Pasos:

  1. Agregar la referencia al paquete Microsoft.AspNetCore.Components.Web.Extensions
  2. Configurar los servicios Microsoft.AspNetCore.Components.Web.Extensions. desde Startup.ConfigureServcies.
  3. Inyectar ProtectedLocalStorage and ProtectedSessionStorage en la implementación del componente:
    1. @inject ProtectedLocalStorage ProtectedLocalStorage
    2. @inject ProtectedSessionStorage ProtectedSessionStorage
  4. Utilizar para el servicio para acceder
private async Task IncrementCount()
{
 await ProtectedLocalStorage.SetAsync("count", ++currentCount);
}

Enlace y validación de modelos con tipos de registro de C# 9

Es posible usar los tipos de registro, disponibles  en C#, con los controladores de MVC o en páginas Razor.

<br />*Person/Index.cshtml*

```razor
@model Person

Name: <input asp-for="Model.Name" />
<span asp-validation-for="Model.Name" />

Age: <input asp-for="Model.Age" />
<span asp-validation-for="Model.Age" />

Mejoras en DynamicRouteValueTransformer

Desde ASP.NET Core en .NET Core 3.1 tenemos DynamicRouteValueTransformer como una manera de utilizar un endpoint personalizado para seleccionar dinámicamente una acción de controlador MVC o una página de Razor. En .NET 5 Preview 8 podemos pasar el estado a su  DynamicRouteValueTransformer  y filtrar el conjunto de puntos de conexión elegidos.

Actualización automática con dotnet watch

En .NET 5, dotnet watch  se ejecuta en un proyecto ASP.NET Core al iniciar el explorador predeterminado y lo actualiza automáticamente a medida que se realizan cambios en el código. Esto significa que podemos abrir un proyecto ASP.NET Core en nuestro  editor de texto favorito, ejecutar dotnet watch run una vez y, a continuación, centrarnos en los cambios de código mientras las herramientas controlan la reconstrucción, reinicio y recarga de la aplicación.

Formador de registrador de consola

Como nombramos antes, se realizaron mejoras en el proveedor de registro de consola en la biblioteca Microsoft.Extensions.Logging.  Ahora podemos implementar un ConsoleFormatter personalizado para ejercer un control completo sobre el formato y la salida de la consola. 

Las API de formateador permiten el formato enriquecido mediante la implementación de un subconjunto de las secuencias de escape VT-100 que son compatibles con la mayoría de los terminales modernos. También podemos detectar si la consola no es compatible que le permite crear un único formateador para todos los terminales.

JSON Console Logger

Además del anterior, tenemos un formateador JSON integrado que emite registros JSON estructurados a la consola. Podemos cambiar el registrador simple predeterminado a JSON.

Conclusión

Mas funcionalidades y caracteristicas para ir probando y estar actualizados apenas este la versión final. En el siguiente post veremos Entity Framerowork Preview 8.

Referencias

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *