我有一个插件架构,我使用
app.MapRazorComponents<MyApp>().AddAdditionalAssemblies()
方法将插件程序集添加到 Razor 页面映射。
插件不保证包含任何页面,因此我只想添加包含带有
@page
指令的文件的程序集。
我做了一些调试,发现为
.razor
文件生成的类设置了 [Microsoft.AspNetCore.Components.RouteAttribute]
,所以我猜 @page
指令被转换为 [Route]
属性。
然而,
[Route]
属性也可以用在控制器上,它们的添加方式不同(.MapControllers()
),因此仅使用此属性作为标记是不够的。
我可能会排除也具有
[ApiController]
属性的类型,或者添加对更多属性(或继承)的检查,但我觉得这很快就会失控。
这是在 .NET 8 中使用 Blazor Web App 模板和服务器渲染模式。
有没有办法检查程序集是否包含任何
.razor
文件(无论是页面还是组件),或者检查程序集是否是“Razor类库”或不仅仅是“类库”?
这与用于检测 Razor 页面的 方法与 AddAdditionalAssemblies
方法相同。
static bool ContainsRazorPagesOrComponents(Assembly assembly)
{
var exported = assembly.GetExportedTypes();
for (var i = 0; i < exported.Length; i++)
{
var candidate = exported[i];
if (candidate.IsAssignableTo(typeof(IComponent)))
{
if (candidate.GetCustomAttributes<RouteAttribute>() is { } routes &&
routes.Any())
{
return true;
}
}
}
return false;
}