
Hoy va un post cortito, pero que puede venir bien a alguien que esté intentando "trocear" su aplicación en distintos proyectos y se haya encontrado con este problema.
Echemos un vistazo al contenido típico del archivo App.razor
de una aplicación Blazor (Server o WebAssembly, da lo mismo):
<Router AppAssembly="@typeof(Program).Assembly">
...
</Router>
Resulta que el componente Router
escanea durante su inicialización el ensamblado que hayamos indicado en su atributo AppAssembly
, por defecto el ensamblado actual, en busca de componentes que:
- Hayan definido sus rutas mediante directivas
@page
de Razor, - o bien, que tengan su ruta especificada con atributos
[Route]
En cualquiera de los casos, los componentes localizados son añadidos a la tabla de rutas y, por tanto, será posible navegar hacia ellos modificando la ruta del navegador, ya sea programáticamente (usando el servicio NavigationManager
) o bien mediante la pulsación de enlaces o modificación directa en la barra de direcciones.
Hasta aquí, todo correcto. El problema viene cuando las páginas que queremos añadir a la tabla de rutas no están en el ensamblado actual, o se encuentran repartidas en varios ensamblados distintos, por ejemplo en:
- Otros proyectos de la solución
- Ensamblados externos, referenciados directamente
- Paquetes NuGet instalados en el proyecto
¿La solución?
Pues es bien sencilla, y consiste únicamente en utilizar el atributo AdditionalAssemblies
para indicar un array de ensamblados adicionales donde debe realizarse la búsqueda, por ejemplo así:
<Router AppAssembly="@typeof(Program).Assembly"
AdditionalAssemblies="@additionalAssemblies">
...
</Router>
@code {
static Assembly[] additionalAssemblies = new[]
{
typeof(ExternalType1).Assembly,
typeof(ExternalType2).Assembly,
};
}
En este caso, además del ensamblado actual (donde se encuentra definida la clase Program
), se añadirían al routing las páginas presentes en los ensamblados donde hayan sido definidos los tipos ExternalType1
y ExternalType2
.
Espero que os sea de utilidad :)
Publicado en Variable not found.