Я пытаюсь разработать модульное приложение Blazor, в котором каждый RCL будет работать как отдельный объект пользовательского интерфейса, и я смогу получить к нему доступ через меню навигации.
Это структура папок:
Код: Выделить всё
Folder PATH listing for volume DATA
Volume serial number is 2224-6101
E:.
? WebPortal.slnx
?
+---WebPortal
? ? appsettings.Development.json
? ? appsettings.json
? ? Program.cs
? ? WeatherForecast.cs
? ? WebPortal.API.csproj
? ? WebPortal.API.csproj.user
? ? WebPortal.http
? ?
? +---Controllers
? ? WeatherForecastController.cs
? ?
? +---obj
? ? +---Debug
? ? +---net10.0
? +---Properties
? launchSettings.json
?
+---WebPortal.Core
? ? IModule.cs
? ? NavItem.cs
? ? WebPortal.Core.csproj
?
+---WebPortal.Module.Dashboard
? ? DashboardModule.cs
? ? ExampleJsInterop.cs
? ? WebPortal.Module.Dashboard.csproj
? ? _Imports.razor
? +---Pages
? ? Dashboard.razor
? ? Dashboard.razor.css
? ?
? +---wwwroot
? background.png
? exampleJsInterop.js
?
+---WebPortal.UI
? appsettings.Development.json
? appsettings.json
? Program.cs
? WebPortal.UI.csproj
? WebPortal.UI.csproj.user
?
+---bin
? +---Debug
? +---net10.0
? appsettings.Development.json
? appsettings.json
? WebPortal.Core.dll
? WebPortal.Core.pdb
? WebPortal.Module.Dashboard.dll
? WebPortal.Module.Dashboard.pdb
? WebPortal.Module.Dashboard.staticwebassets.endpoints.json
? WebPortal.Module.Dashboard.staticwebassets.runtime.json
? WebPortal.UI.deps.json
? WebPortal.UI.dll
? WebPortal.UI.exe
? WebPortal.UI.pdb
? WebPortal.UI.runtimeconfig.json
? WebPortal.UI.staticwebassets.endpoints.json
? WebPortal.UI.staticwebassets.runtime.json
?
+---Components
? ? App.razor
? ? Routes.razor
? ? _Imports.razor
? ?
? +---Layout
? ? MainLayout.razor
? ? MainLayout.razor.css
? ? NavMenu.razor
? ? NavMenu.razor.css
? ? ReconnectModal.razor
? ? ReconnectModal.razor.css
? ? ReconnectModal.razor.js
? ?
? +---Pages
? Counter.razor
? Error.razor
? Home.razor
? NotFound.razor
? Weather.razor
?
+---Helpers
? AssemblyScanning.cs
? +---Debug
? +---net10.0
? +---ref
? ? WebPortal.UI.dll
? ?
? +---refint
? ? WebPortal.UI.dll
? ?
? +---scopedcss
? ? +---bundle
? ? ? WebPortal.UI.styles.css
? ? ?
? ? +---Components
? ? ? +---Layout
? ? ? MainLayout.razor.rz.scp.css
? ? ? NavMenu.razor.rz.scp.css
? ? ? ReconnectModal.razor.rz.scp.css
? ? ?
? ? +---projectbundle
? ? WebPortal.UI.bundle.scp.css
? ?
? +---staticwebassets
+---Properties
? launchSettings.json
?
+---wwwroot
? app.css
? favicon.png
?
+---lib
+---bootstrap
+---dist
+---css
+---js
К сожалению, контент, который вы ищете, не существует
Это мои файлы Routes.razor и Program.cs:
Код: Выделить всё
Routes.razor:
@using WebPortal.UI.Helpers
Код: Выделить всё
Program.cs:
using WebPortal.UI.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler( "/Error", createScopeForErrors: true );
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseHttpsRedirection();
app.UseRouting();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents()
.AddInteractiveServerRenderMode();
app.Run();
Код: Выделить всё
AssemblyScanning.cs:
public static class AssemblyScanning
{
// Thread-safe, lazy, cached result
private static readonly Lazy _cachedAssemblies =
new Lazy(LoadAssemblies, isThreadSafe: true);
public static List GetAssemblies()
{
return _cachedAssemblies.Value;
}
private static List LoadAssemblies()
{
List allAssemblies = new();
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!;
var files = Directory.GetFiles(path, "*.dll");
foreach (string dll in files.Where(x =>
Path.GetFileName(x).StartsWith("WebPortal.Module")))
{
// IMPORTANT: Use LoadFrom, not LoadFile
allAssemblies.Add(Assembly.LoadFrom(dll));
}
return allAssemblies
.Where(a => a.GetTypes()
.Any(t => t.GetInterfaces().Contains(typeof(IModule))))
.ToList();
}
public static IEnumerable GetTypes()
{
return GetAssemblies()
.SelectMany(a =>
a.DefinedTypes.Where(x =>
x.GetInterfaces().Contains(typeof(T))));
}
public static IEnumerable GetInstances()
{
foreach (Type implementation in GetTypes())
{
if (!implementation.IsAbstract)
{
yield return (T)Activator.CreateInstance(implementation)!;
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... pp-project
Мобильная версия