Desarrollo

Deconstrucción de Tuplas

Método ligero para devolver varios valores y asignarlos a variables:

        public void HazCosas()
        {
            int i;
            DateTime d;
            (i, _, d) = GetTuple();
        }
        private (int, string, DateTime) GetTuple()
        {
            return (2, "valor", DateTime.Now);
        }

Puede crearse una función que devuelve varios parámetros y recogerlos de forma individual, pudiendo además no recoger todos gracias al operador de descarte.

Es evidente que el abuso de tuplas en lugar de modelar los objetos que queremos devolver empeora la legibilidad del código, pero tiene su utilidad.

Anuncio publicitario
Blazor, Desarrollo

Añadir EF a un proyecto de 6.0

Instalar nuggets:

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer

ACTUALIZA Data Entity Tools

dotnet tool update --global dotnet-ef

Crear DataContext desde consola de proyecto:

dotnet ef dbcontext scaffold "Server=.\SQL2019;Initial Catalog=NombreDB;Integrated Security=True;Connection Timeout=30;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer --data-annotations --context NombreContexto--context-dir EF --output-dir EF --force

Compila, y ya está listo para añadir al contenedor de dependencias:

builder.Services.AddDbContextFactory<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
Blazor, Desarrollo

Enlace bidireccional de parámetro a componente

Hay dos formas básicas:

  • Usando bind-nombre del parámetro
  • Usando la combinación de unir el parámetro y subscribirse al evento de cambio.
<p>@ID</p>
<p>@ID2</p>
<form>
    <SelectIdearia @bind-Valor=ID ></SelectIdearia>
    <SelectIdearia Valor=ID2 ValorChanged=OnChange></SelectIdearia>
    <button>OK</button>
</form>

Normalmente la opción con bind es más cómoda, pero si se necesita actualizar algo en cuanto el valor cambia puede sernos útil la segunda.

public Guid ID { get; set; }
public Guid ID2 { get; set; }
public void OnChange(Guid args)=>ID2 = args;

La elección del nombre del evento no es libre, debe nombrarse como ParametroChanged para que funcione correctametne la sintaxis con @bind

La sintaxis en el emisor del evento para declaración e invocación es así:

[Parameter]
public EventCallback<Guid> KeyChanged { get; set; }

KeyChanged.InvokeAsync(value);
Blazor, Desarrollo

Componente con plantilla

Ejemplo sencillo de como crear componentes con plantilla, esto es, componentes que aceptan como parámetro su contenido

@using System.Diagnostics.CodeAnalysis
@if (ModalHeader != null)
{
    <div class="modal-header">
        @ModalHeader
    </div>
}
<div class="modal-body">
    @ModalBody
</div>
@if (ModalFooter != null)
{
    <div class="modal-footer">
        @ModalFooter
    </div>
}
@code {
    [Parameter, AllowNull]
    public RenderFragment? ModalHeader { get; set; }
    [Parameter]
    public RenderFragment ModalBody { get; set; } = null!;
    [Parameter, AllowNull]
    public RenderFragment? ModalFooter { get; set; }

  }

La forma de usar este componente sería algo así:

<Modal>
    <ModalHeader>
        <h4>Hola</h4>
    </ModalHeader>
    <ModalBody>
        <form>
            <input />
        </form>
    </ModalBody>
</Modal>

Muy interesante el uso avanzado, puede ponerse como componente genérico y que cada fragmento acepte un parámetro. El ejemplo de la página oficial de Microsoft es muy explicativo:

https://docs.microsoft.com/en-us/aspnet/core/blazor/components/templated-components?view=aspnetcore-6.0