0

.Net, Asp.Net y EF 5 Release Candidate 2

Desde el 13 de octubre tenemos disponible .Net 5, Asp.Net Core 5 y Entity Framework Core 5 Release Candidate 2. Esta RC2 nos da un último panorama antes de la salida oficial el 10 de noviembre durante el evento NetConf 2020. Si bien, tal vez no tengamos una gran cantidad de novedades, veamos las que son relevantes es esta Release Candidate.

.Net 5.0 RC2

Esta versión incluye muchas mejoras, especialmente en un entorno de aplicaciones de un solo archivo, imágenes de contenedores mucho más pequeñas, nuevas notaciones para casos de validación de nulos, compatibilidad con Windows ARM64, mejoras de rendimiento en las librerías de .Net, en Garbage Collector y en el JIT. No debemos olvidar que .Net 5 incluye las nuevas versiones de C# 9 y F# 5.

Coincidencia de patrones de C # 9

Esta característica existe desde la versión 7 de C# . Introducía la noción de patrones, en términos abstractos, son elementos sintácticos que un valor puede tener alguna forma y extraer la información.

Durante la evolución de C# 7, 8  y 9 el equipo agregó nuevos patrones en cada versión. Nos centraremos solamente es lo fueron agregados en la versión 9:

  • Patrones relacionales, podemos utilizar los operadores relacionales como < y >=
  • Patrones lógicos, podemos utilizar palabras claves como and, or y not, muy útil cuando necesitamos comparar varias cosas en un solo patrón.
  • Patrones simples, utilizando únicamente un tipo y ninguna otra sintaxis de coincidencia.

Veamos un ejemplo de 2 expresiones dentro de una aplicación:

public static bool IsAccessOKAskMycroft(Person person) => person switch
{
	// Type pattern
	OpenCaseFile f when f.Name == "Jim Moriarty"    => true,
	// Simple type pattern
	Mycroft                                         => true,
	_                                               => false,
};

Los dos primeros son patrones del tipo tipográficos. El primero funciona en C# 8, el segundo, es un ejemplo del nuevo patrón simple. Antes, en C#,  este patrón necesitaba un identificador, en C# 9 el identificador ya no es necesario.

Veamos otro ejemplo, en la siguiente declaración if comprueba un patrón lógico, las siguentes dos instancias de un patrón de tipo:

if (user is Mycroft m &amp;&amp; m.CaresAbout is not object)
{
	Console.WriteLine("Mycroft dissapoints us again.");
}

El tipo no se conoce, por lo que la variable user se valida para el tipo Mycroft y luego se asigna si es válido. Se valida si una propiedad del objeto Mycroft no es un objeto, por último para destacar, una prueba por null también habría funcionado, pero no habría demostrado el patrón lógico.

Ahora veamos un ejemplo más amplio:

public static bool IsAccessOkOfficial(Person user, Content content, int season) => (user, content, season) switch 
{
	// Tuple + property patterns
	({Type: Child}, {Type: ChildsPlay}, _)          => true,
	({Type: Child}, _, _)                           => false,
	(_ , {Type: Public}, _)                         => true,
	({Type: Monarch}, {Type: ForHerEyesOnly}, _)    => true,
	// Tuple + type patterns
	(OpenCaseFile f, {Type: ChildsPlay}, 4) when f.Name == "Sherlock Holmes"  => true,
	// Property and type patterns
	{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}} 
		when type == PoorlyDefined &amp;&amp; name.Contains("Sherrinford") &amp;&amp; season >= 3 => true,
	// Tuple and type patterns
	(OpenCaseFile, var c, 4) when c.Name.Contains("Sherrinford")              => true,
	// Tuple, Type, Property and logical patterns 
	(OpenCaseFile {RiskLevel: >50 and <100 }, {Type: StateSecret}, 3) => true,
	_                                               => false,
};

Este es uno de los más interesante, en el último vemos, que se valida Risklevel > 50 y < 100. No se si lo notaron, pero no tuvimos que escribir nuevamente el nombre de la variable. Siempre en un if hacíamos RiskLevel > 50 and RiskLevel < 100. Ahora podemos obviar la segunda variable.

(OpenCaseFile {RiskLevel: var riskLevel}, {Type: StateSecret}, 3) when riskLevel switch
{
	>50 and <100        => true,
	_                   => false
} 

Muchas veces el patrón posicional no es conveniente y solo deseamos usar parte de la tupla. Aquí entra en juego el patrón de propiedad, veamos:

{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}} 
            when type == PoorlyDefined &amp;&amp; name.Contains("Sherrinford") &amp;&amp; season >= 3 => true,

El punto fuerte es que se están probando las propiedades de la tupla, en lugar de hacer coincidir la tupla por posición. Esto es mucho más flexible.

ClickOnce

Durante mucho tiempo ClickOnce fue una opción de implementación muy usada. Ahora es compatible con las aplicaciones de Windows .NET Core 3.1 y .NET 5.0. Muchas personas querrían usar ClickOnce para la implementación de aplicaciones en Windows Forms y compatibilidad con WPF a .NET Core 3.0. Desde el año pasado, los equipos de .NET y Visual Studio trabajaron juntos para habilitar la publicación ClickOnce, tanto en la línea de comandos como en Visual Studio.

Los objetivos principales eran:

  • Tener una experiencia familiar para ClickOnce en Visual Studio.
  • Habilitar un CI / CD para la publicación ClickOnce con línea de comandos, con MSBuild o la herramienta Mage.

Veamos algunas capturas de para comprender mejor, primero la ventana de publicación de proyecto.

El modelo de implementación depende del marco de trabajo. Por eso es necesario tener instalado .Net Desktop Runtime debido a que contiene WPF y Windows Forms.

Aún podemos aprovechar las funcionalidades de actualización y sin conexión de ClickOnce.

También se incluyen las ubicaciones de instalación y características de firma de manifiesto. Totalmente cubiertos en la nueva experiencia.

Ahora veamos como es en la línea de comandos con Mage.

dotnet tool install -g Microsoft.DotNet.Mage

Con el siguiente comando logramos configurar y publicar una aplicación.

El siguiente comando inicia la aplicación ClickOnce.

Y luego aparece el cuadro de diálogo de instalación muy similar al antiguo de ClickOnce.

Luego de instalar la aplicación se iniciará automáticamente.

Cuando tengamos una nueva versión de nuestra aplicación, el usuario verá el siguiente cuadro de actualización.

Si le damos Ok, se lanzará la actualización, y luego, se ejecutará.

Básicamente el objetivo es brindar la compatibilidad, soporte y experiencia que existía en el .Net Framework, es compatible con Edge e Internet Explorer. Tal vez en el futuro sean soportados más navegadores.

Windows Arm64

Están disponibles los instaladores de MSI para Windows Arm64, podemos ver en la siguiente imagen del instalador de .NET 5.0 SDK.

Para probar la instalación podemos ejecutar el comando dotnet-runtimeinfo para ver la información. Nos dará un resultado similar al siguiente:

C:\Users\rich>dotnet tool install -g dotnet-runtimeinfo
You can invoke the tool using the following command: dotnet-runtimeinfo
Tool 'dotnet-runtimeinfo' (version '1.0.2') was successfully installed.

C:\Users\rich>dotnet-runtimeinfo
**.NET information
Version: 5.0.0
FrameworkDescription: .NET 5.0.0-rc.2.20475.5
Libraries version: 5.0.0-rc.2.20475.5
Libraries hash: c5a3f49c88d3d907a56ec8d18f783426de5144e9

**Environment information
OSDescription: Microsoft Windows 10.0.18362
OSVersion: Microsoft Windows NT 10.0.18362.0
OSArchitecture: Arm64
ProcessorCount: 8

El SDK de .NET 5.0 todavía contiene los componentes de escritorio de Windows Forms y WPF en Windows Arm64. Aunque todavía no hay fecha,  se espera que puedan agregar el paquete de escritorio de Windows para Windows Arm64 en una actualización de servicio 5.0, pero, las aplicaciones de consola y ASP.NET Core son compatibles con Windows Arm64.

ASP.NET Core updates en .NET 5 RC2

Estas son las novedades de esta versión de RC2:

  • Mejoras en el aislamiento de CSS
  • Mejoras en la depuración de Blazor WebAssembly
  • Herramientas de compatibilidad con la plataforma del navegador

Mejoras en el aislamiento de CSS

En la preview 8 se introdujo el soporte para el aislamiento CSS para componentes Blazor. Gracias al feedback de los usuarios, se han realizado una serie de mejoras en el aislamiento de CSS para esta versión.

Anteriormente, todos los archivos CSS con ámbito de componente, incluidos los archivos de proyectos o paquetes referenciados, se compilaban en un solo paquete, scoped.styles.css. Ahora podemos producir un paquete por proyecto o paquete referenciado e incluir esos paquetes en el paquete de la aplicación a través de declaraciones CSS @import.

Los nombres de los paquetes ahora se basan en los nombres del proyecto: {project_name} .styles.css. Podemos hacer referencia a cada paquete desde la ruta raíz de la aplicación de forma predeterminada. Esto hace que la ruta del paquete de aplicaciones sea la misma para los proyectos Blazor Server y Blazor WebAssembly:

Component1.razor.css

.my-component {
    border: 2px dashed red;
    padding: 1em;
    margin: 1em 0;
    background-image: url('background.png');
}

Se solucionaron algunos problemas en la forma que se compilan los estilos CSS con ámbito para que los cambios se visualizan correctamente con cada compilación en Visual Studio en lugar de requerir una reconstrucción completa.

Mejoras en la depuración de Blazor WebAssembly

.NET 5 incluye una variedad de mejoras para la depuración de Blazor WebAssembly:

  • Mejoras de confiabilidad, incluida la solución del problema del conflicto de puertos de RC1.
  • Soporte mejorado para pasar y salir de métodos asincrónicos.
  • Inspección objetos locales o las propiedades de los objetos en muchas situaciones previamente no admitidas
    • Para miembros heredados
    • Para delegados de multidifusión
    • Para boxed values
    • Para valores <T> que aceptan valores NULL
    • Dentro de las llamadas basadas en la reflexión
  • Soporte para depurar ensamblados cargados diferidos

Herramientas de compatibilidad con la plataforma del navegador

Podemos  indicar qué API son compatibles en algunos escenarios especiales del navegador. El analizador de compatibilidad de plataforma utilizará estos datos para dar las advertencias adecuadas cuando se utilizan API de una aplicación Blazor WebAssembly que no son compatibles cuando se ejecutan en un navegador en WebAssembly.

Entity Framework Core en .Net 5 RC2

En esta versión no fueron incluidas nuevas funcionalidades, pero si se actualizó la documentación que cubre todas la funcionalidades introducidas en cada versión, como también, se incluyen varias de correcciones de errores.

Pueden encontrar toda la documentación desde este link

Conclusiones

Desde la preview 1 hasta esta versión, la RC2, pasaron 10 actualizaciones. Hemos recorrido todos los cambios hasta ahora. Muchos estamos esperando ansiosamente la salida de .Net 5 y el evento NetConf 2020 para ver todo lo que nos espera con esta nueva versión. Espero que hayan disfrutado este post.

Fernando Sonego

Deja una respuesta

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