Estoy usando .net 5 para una aplicación Blazor en un proyecto con anulable habilitado. Está utilizando Code Behind para crear Blazor Components. Quiero usar un constructor para evitar marcar todas las propiedades que no sean DI como anulables para simplificar el acceso a ellas en mi código blazor. Sin embargo, si creo un constructor como public PageNumberOne(ILogger<PrimaryItem> logger) {}

Recibo el error MissingMethodException: no hay un constructor sin parámetros definido para el tipo

Si utilizo el atributo de inyección en los elementos DI, aparece la advertencia: La propiedad no anulable _logger debe contener un valor no nulo al excitar el constructor

Entonces, ¿cómo mezclo DI con anulable sin solo marcar cada propiedad como anulable?

También podría crearlos en el cuerpo principal del bloque "código", pero luego no puedo acceder a mis elementos DI para la inicialización porque no están disponibles hasta el OnInitialized. Así que nuevamente tengo que marcarlos como Nullable.

2
Nick Gelotte 23 feb. 2021 a las 09:54

1 respuesta

La mejor respuesta

Trabajo en el mismo escenario: Blazor Components + Nullable. Lo que hago es declarar parámetros como anulables y uso ! (nulo-indulgente) cuando uso los parámetros:

[Inject]
public NavigationManager? MyNavigationManager {get; set;}

[Parameter]
public MenuItem? MyMenuItem {get; set;}

protected void Foo()
{
    var currenturi = MyNavigationManager!.Uri; //<--- here
    var sometext = MyMenuItem!.text; //<--- here
    // ...

La alternativa de Kirk Woll vía comentario, más elegante en mi opinión:

Alternativamente, simplemente asuma que la inyección funcionará y declare la propiedad como:

[Inject]
public NavigationManager MyNavigationManager {get; set;} = default!;

Lo he probado y funciona bien con interfaces o clases sin constructor sin parámetros.

3
dani herrera 24 feb. 2021 a las 09:57