Attualmente sto usando ExtCore per creare un'API modulare e voglio rendere modulare anche l'applicazione Blazor SPA.
Voglio avere un progetto Blazor di base che importa i file .cshtml da altri progetti in modo da avere un singolo progetto per sezione dell'applicazione SPA che codifica la soluzione in modo modulare.
Non riesco a usare ExtCore poiché ha richiesto che il progetto fosse .net core e Blazor è .net standard (ha provato a cambiarlo in .net core ed è saltato in aria).
Qualsiasi consiglio è molto apprezzato.
Da quando ho posto la mia domanda molto è cambiato. Blazor è ora una parte completamente supportata di .net core e gli strumenti sono notevolmente migliorati.
La creazione di un'app Blazor modulare è ora semplificata dalle librerie di classi Razor
Le librerie di classi Razor ti consentono di creare un progetto che contiene
Microsoft Docs: libreria di classi Razor
Rendere modulari le librerie di classi di rasoio
All'interno di App.razor è presente il router per Blazor.
Il router ha un parametro cotto che accetta una serie di assiemi aggiuntivi per esaminare e trovare eventuali percorsi aggiuntivi. Complessivamente chiamato AdditionalAssemblies
Quindi è possibile utilizzare il parametro "AdditionalAssemblies" per puntare a un metodo che analizza le librerie di classi di rasoio di riferimento per Pages.
<Router AppAssembly="@typeof(Program).Assembly" AdditionalAssemblies="AssemblyScanning.GetAssemblies().ToArray()">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
Progetto di esempio
Ho messo insieme un progetto di esempio su github come esempio.
Nessun quadro. Solo i bit Blazor predefiniti, un paio di interfacce di base e alcune scansioni di assiemi.
Creare una ClassLibrary (.Net Standard). Modificare il csproj scaricandolo in Visual Studio. Deve essere simile a questo.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<BlazorLinkOnBuild>False</BlazorLinkOnBuild>
<TargetFramework>netstandard2.0</TargetFramework>
<RunCommand>dotnet</RunCommand>
<RunArguments>blazor serve</RunArguments>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.0-preview2-30230" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Browser" Version="0.1.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="0.1.0" />
<DotNetCliToolReference Include="Microsoft.AspNetCore.Blazor.Cli" Version="0.1.0" />
</ItemGroup>
<ItemGroup>
<Content Include="Pages\**\*.cshtml" />
</ItemGroup>
Creare una struttura di cartelle come sotto.
Pages
|-----> _ViewImports.cshtml
|
|-----> Shared.cshtml
_ViewImports.cshtml
@using System.Net.Http
@using Microsoft.AspNetCore.Blazor
@using Microsoft.AspNetCore.Blazor.Components
@using Microsoft.AspNetCore.Blazor.Layouts
@using Microsoft.AspNetCore.Blazor.Routing
@using MyLibrary
Shared.cshtml
@page "/shared"
<h1>This is a shared page</h1>
@functions {
}
Crea MyLibrary.dll facendo clic con il tasto destro del mouse sul progetto e Ricostruisci, C'è un bug in questo momento, questo non è compilato automaticamente con il progetto principale.
Selezionare l'applicazione Web principale e aggiungere MyLibrary alle dipendenze.
Nella _ViewImports.cshtml dell'applicazione Web principale aggiungere le direttive using.
@addTagHelper *, MyLibrary
@using System.Net.Http
@using Microsoft.AspNetCore.Blazor
@using Microsoft.AspNetCore.Blazor.Components
@using Microsoft.AspNetCore.Blazor.Layouts
@using Microsoft.AspNetCore.Blazor.Routing
@using WebApplication7
@using WebApplication7.Shared
@using MyLibrary.Pages
Adesso è il momento di aggiungere il link alla pagina
<NavLink href="/shared">
<span class='glyphicon glyphicon-education'></span> Shared Page
</NavLink>
Ulteriori informazioni su Razor: https://blogs.msdn.microsoft.com/webdev/2018/03/01/asp-net-core-2-1-razor-ui-in-class-libraries/
Su Blazor Problema: https://github.com/aspnet/Blazor/issues/340