Freigeben von Controllern, Ansichten, Razor Pages und vielem mehr mit Anwendungsparts
Von Rick Anderson
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Ein Anwendungspart ist eine Abstraktion der Ressourcen einer App. Anwendungsparts ermöglichen es ASP.NET Core, Controller, Ansichtskomponenten, Taghilfsprogramme, Razor-Pages, razor-Kompilierungsquellen und vieles mehr zu ermitteln. AssemblyPart ist ein Anwendungspart. AssemblyPart
kapselt einen Assemblyverweis und macht Typen und Kompilierungsverweise verfügbar.
Featureanbieter arbeiten mit Anwendungsparts, um die Features einer ASP.NET Core-Anwendung aufzufüllen. Anwendungsparts werden hauptsächlich dafür eingesetzt, eine App so zu konfigurieren, dass sie die ASP.NET Core-Features in einer Assembly ermittelt (oder das Laden solcher Features vermeidet). Ein Beispiel: Sie möchten einige gängige Funktionen in mehreren Apps gemeinsam nutzen. Mithilfe von Anwendungsteilen können Sie eine Assembly (DLL) für mehrere Apps freigeben, die Controller, Ansichten, Razor Pages, razor-Kompilierungsquellen, Taghilfsprogramme und vieles mehr enthält. Die Freigabe einer Assembly ist dem Duplizieren von Code in mehreren Projekten vorzuziehen.
ASP.NET Core-Apps laden Features aus ApplicationPart. Die AssemblyPart-Klasse stellt ein Anwendungspart dar, das durch eine Assembly gesichert wird.
Laden von ASP.NET Core-Features
Verwenden Sie die Klassen Microsoft.AspNetCore.Mvc.ApplicationParts und AssemblyPart, um ASP.NET Core-Features (Controller, Ansichtskomponenten usw.) zu ermitteln und zu laden. Der ApplicationPartManager verfolgt die verfügbaren Anwendungsparts und Featureanbieter nach. Der ApplicationPartManager
wird in Startup.ConfigureServices
konfiguriert:
// Requires using System.Reflection;
public void ConfigureServices(IServiceCollection services)
{
var assembly = typeof(MySharedController).Assembly;
services.AddControllersWithViews()
.AddApplicationPart(assembly)
.AddRazorRuntimeCompilation();
services.Configure<MvcRazorRuntimeCompilationOptions>(options =>
{ options.FileProviders.Add(new EmbeddedFileProvider(assembly)); });
}
Der folgende Code bietet einen alternativen Ansatz, um den ApplicationPartManager
mithilfe von AssemblyPart
zu konfigurieren:
// Requires using System.Reflection;
// Requires using Microsoft.AspNetCore.Mvc.ApplicationParts;
public void ConfigureServices(IServiceCollection services)
{
var assembly = typeof(MySharedController).Assembly;
// This creates an AssemblyPart, but does not create any related parts for items such as views.
var part = new AssemblyPart(assembly);
services.AddControllersWithViews()
.ConfigureApplicationPartManager(apm => apm.ApplicationParts.Add(part));
}
Die beiden oben gezeigten Codebeispiele laden den SharedController
aus einer Assembly. Der SharedController
befindet sich nicht im Projekt der App. Weitere Informationen finden Sie im Beispieldownload für eine WebAppParts-Lösung.
Einschließen von Ansichten
Verwenden Sie eine Razor-Klassenbibliothek, um Ansichten in die Assembly einzuschließen.
Vermeiden des Ladens von Ressourcen
Anwendungsparts können verwendet werden, um das Laden von Ressourcen in einer bestimmten Assembly oder einem bestimmten Speicherort zu vermeiden. Fügen Sie der Sammlung Microsoft.AspNetCore.Mvc.ApplicationParts Elemente hinzu, oder entfernen Sie Elemente aus der Sammlung, um Ressourcen auszublenden oder verfügbar zu machen. Die Reihenfolge der Einträge in der ApplicationParts
-Sammlung ist nicht wichtig. Konfigurieren Sie den ApplicationPartManager
, bevor er zur Konfiguration von Diensten im Container verwendet wird. Beispielsweise sollten Sie den ApplicationPartManager
vor dem Aufrufen von AddControllersAsServices
konfigurieren. Rufen Sie Remove
in der ApplicationParts
-Sammlung auf, um eine Ressource zu entfernen.
Der ApplicationPartManager
enthält Parts für Folgendes:
- Die Assembly der App und die abhängigen Assemblys.
Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
Microsoft.AspNetCore.Mvc.TagHelpers
.Microsoft.AspNetCore.Mvc.Razor
.
Featureanbieter
Anwendungsfeatureanbieter untersuchen Anwendungsparts und bieten Features für diese. Es gibt integrierte Featureanbieter für die folgenden ASP.NET Core-Features:
- ControllerFeatureProvider
- TagHelperFeatureProvider
- MetadataReferenceFeatureProvider
- ViewsFeatureProvider
internal class
RazorCompiledItemFeatureProvider
Featureanbieter erben von IApplicationFeatureProvider<TFeature>, wobei T
der Typ des Features ist. Featureanbieter können für jeden der oben aufgeführten Featuretypen implementiert werden. Die Reihenfolge der Featureanbieter in ApplicationPartManager.FeatureProviders
kann sich auf das Laufzeitverhalten auswirken. Später hinzugefügte Anbieter können auf Aktionen reagieren, die von früher hinzugefügten Anbietern ausgeführt wurden.
Anzeigen verfügbarer Features
Die für eine App verfügbaren Features können aufgelistet werden, indem durch Abhängigkeitsinjektion ein ApplicationPartManager
angefordert wird:
using AppPartsSample.ViewModels;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Controllers;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Razor.Compilation;
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewComponents;
namespace AppPartsSample.Controllers
{
public class FeaturesController : Controller
{
private readonly ApplicationPartManager _partManager;
public FeaturesController(ApplicationPartManager partManager)
{
_partManager = partManager;
}
public IActionResult Index()
{
var viewModel = new FeaturesViewModel();
var controllerFeature = new ControllerFeature();
_partManager.PopulateFeature(controllerFeature);
viewModel.Controllers = controllerFeature.Controllers.ToList();
var tagHelperFeature = new TagHelperFeature();
_partManager.PopulateFeature(tagHelperFeature);
viewModel.TagHelpers = tagHelperFeature.TagHelpers.ToList();
var viewComponentFeature = new ViewComponentFeature();
_partManager.PopulateFeature(viewComponentFeature);
viewModel.ViewComponents = viewComponentFeature.ViewComponents.ToList();
return View(viewModel);
}
}
}
Das Downloadbeispiel verwendet den oben stehenden Code, um die App-Features anzuzeigen:
Controllers:
- FeaturesController
- HomeController
- HelloController
- GenericController`1
- GenericController`1
Tag Helpers:
- PrerenderTagHelper
- AnchorTagHelper
- CacheTagHelper
- DistributedCacheTagHelper
- EnvironmentTagHelper
- Additional Tag Helpers omitted for brevity.
View Components:
- SampleViewComponent
Ermittlung in Anwendungsparts
Bei der Entwicklung mit Anwendungsparts sind HTTP-404-Fehler nicht ungewöhnlich. Diese Fehler werden in der Regel dadurch verursacht, dass eine essenzielle Anforderung an die Ermittlung von Anwendungsparts nicht erfüllt ist. Wenn Ihre App einen HTTP-404-Fehler zurückgibt, überprüfen Sie, ob die folgenden Anforderungen erfüllt sind:
- Die
applicationName
-Einstellungen müssen auf die Stammassembly festgelegt sein, die für die Ermittlung verwendet wird. Die für die Ermittlung verwendete Stammassembly ist normalerweise die Einstiegspunktassembly. - Die Stammassembly muss einen Verweis auf das für die Ermittlung verwendete Part enthalten. Der Verweis kann direkt oder transitiv sein.
- Die Stammassembly muss auf das Web-SDK verweisen. Das Framework verfügt über eine Logik, die Attribute in die Stammassembly einfügt, die für die Ermittlung verwendet werden.
Von Rick Anderson
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Ein Anwendungspart ist eine Abstraktion der Ressourcen einer App. Anwendungsparts ermöglichen es ASP.NET Core, Controller, Ansichtskomponenten, Taghilfsprogramme, Razor-Pages, razor-Kompilierungsquellen und vieles mehr zu ermitteln. AssemblyPart ist ein Anwendungspart. AssemblyPart
kapselt einen Assemblyverweis und macht Typen und Kompilierungsverweise verfügbar.
Featureanbieter arbeiten mit Anwendungsparts, um die Features einer ASP.NET Core-Anwendung aufzufüllen. Anwendungsparts werden hauptsächlich dafür eingesetzt, eine App so zu konfigurieren, dass sie die ASP.NET Core-Features in einer Assembly ermittelt (oder das Laden solcher Features vermeidet). Ein Beispiel: Sie möchten einige gängige Funktionen in mehreren Apps gemeinsam nutzen. Mithilfe von Anwendungsteilen können Sie eine Assembly (DLL) für mehrere Apps freigeben, die Controller, Ansichten, Razor Pages, razor-Kompilierungsquellen, Taghilfsprogramme und vieles mehr enthält. Die Freigabe einer Assembly ist dem Duplizieren von Code in mehreren Projekten vorzuziehen.
ASP.NET Core-Apps laden Features aus ApplicationPart. Die AssemblyPart-Klasse stellt ein Anwendungspart dar, das durch eine Assembly gesichert wird.
Laden von ASP.NET Core-Features
Verwenden Sie die Klassen ApplicationPart
und AssemblyPart
, um ASP.NET Core-Features (Controller, Ansichtskomponenten usw.) zu ermitteln und zu laden. Der ApplicationPartManager verfolgt die verfügbaren Anwendungsparts und Featureanbieter nach. Der ApplicationPartManager
wird in Startup.ConfigureServices
konfiguriert:
public void ConfigureServices(IServiceCollection services)
{
// Requires using System.Reflection;
var assembly = typeof(MySharedController).GetTypeInfo().Assembly;
services.AddMvc()
.AddApplicationPart(assembly)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Der folgende Code bietet einen alternativen Ansatz, um den ApplicationPartManager
mithilfe von AssemblyPart
zu konfigurieren:
public void ConfigureServices(IServiceCollection services)
{
// Requires using System.Reflection;
// Requires using Microsoft.AspNetCore.Mvc.ApplicationParts;
var assembly = typeof(MySharedController).GetTypeInfo().Assembly;
var part = new AssemblyPart(assembly);
services.AddMvc()
.ConfigureApplicationPartManager(apm => apm.ApplicationParts.Add(part))
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Die beiden oben gezeigten Codebeispiele laden den SharedController
aus einer Assembly. Der SharedController
befindet sich nicht im Projekt der Anwendung. Weitere Informationen finden Sie im Beispieldownload für eine WebAppParts-Lösung.
Einschließen von Ansichten
Verwenden Sie eine Razor-Klassenbibliothek, um Ansichten in die Assembly einzuschließen.
Vermeiden des Ladens von Ressourcen
Anwendungsparts können verwendet werden, um das Laden von Ressourcen in einer bestimmten Assembly oder einem bestimmten Speicherort zu vermeiden. Fügen Sie der Sammlung Microsoft.AspNetCore.Mvc.ApplicationParts Elemente hinzu, oder entfernen Sie Elemente aus der Sammlung, um Ressourcen auszublenden oder verfügbar zu machen. Die Reihenfolge der Einträge in der ApplicationParts
-Sammlung ist nicht wichtig. Konfigurieren Sie den ApplicationPartManager
, bevor er zur Konfiguration von Diensten im Container verwendet wird. Beispielsweise sollten Sie den ApplicationPartManager
vor dem Aufrufen von AddControllersAsServices
konfigurieren. Rufen Sie Remove
in der ApplicationParts
-Sammlung auf, um eine Ressource zu entfernen.
Der folgende Code verwendet Microsoft.AspNetCore.Mvc.ApplicationParts, um MyDependentLibrary
aus der App zu entfernen:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.ConfigureApplicationPartManager(apm =>
{
var dependentLibrary = apm.ApplicationParts
.FirstOrDefault(part => part.Name == "MyDependentLibrary");
if (dependentLibrary != null)
{
apm.ApplicationParts.Remove(dependentLibrary);
}
});
}
Der ApplicationPartManager
enthält Parts für Folgendes:
- Die Assembly der App und die abhängigen Assemblys.
Microsoft.AspNetCore.Mvc.TagHelpers
.Microsoft.AspNetCore.Mvc.Razor
.
Anwendungsfeatureanbieter
Anwendungsfeatureanbieter untersuchen Anwendungsparts und bieten Features für diese. Es gibt integrierte Featureanbieter für die folgenden ASP.NET Core-Features:
Featureanbieter erben von IApplicationFeatureProvider<TFeature>, wobei T
der Typ des Features ist. Featureanbieter können für jeden der oben aufgeführten Featuretypen implementiert werden. Die Reihenfolge der Featureanbieter in ApplicationPartManager.FeatureProviders
kann sich auf das Laufzeitverhalten auswirken. Später hinzugefügte Anbieter können auf Aktionen reagieren, die von früher hinzugefügten Anbietern ausgeführt wurden.
Anzeigen verfügbarer Features
Die für eine App verfügbaren Features können aufgelistet werden, indem durch Abhängigkeitsinjektion ein ApplicationPartManager
angefordert wird:
using AppPartsSample.ViewModels;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Controllers;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Razor.Compilation;
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
using Microsoft.AspNetCore.Mvc.ViewComponents;
namespace AppPartsSample.Controllers
{
public class FeaturesController : Controller
{
private readonly ApplicationPartManager _partManager;
public FeaturesController(ApplicationPartManager partManager)
{
_partManager = partManager;
}
public IActionResult Index()
{
var viewModel = new FeaturesViewModel();
var controllerFeature = new ControllerFeature();
_partManager.PopulateFeature(controllerFeature);
viewModel.Controllers = controllerFeature.Controllers.ToList();
var tagHelperFeature = new TagHelperFeature();
_partManager.PopulateFeature(tagHelperFeature);
viewModel.TagHelpers = tagHelperFeature.TagHelpers.ToList();
var viewComponentFeature = new ViewComponentFeature();
_partManager.PopulateFeature(viewComponentFeature);
viewModel.ViewComponents = viewComponentFeature.ViewComponents.ToList();
return View(viewModel);
}
}
}
Das Downloadbeispiel verwendet den oben stehenden Code, um die App-Features anzuzeigen:
Controllers:
- FeaturesController
- HomeController
- HelloController
- GenericController`1
- GenericController`1
Tag Helpers:
- PrerenderTagHelper
- AnchorTagHelper
- CacheTagHelper
- DistributedCacheTagHelper
- EnvironmentTagHelper
- Additional Tag Helpers omitted for brevity.
View Components:
- SampleViewComponent
Ermittlung in Anwendungsparts
Bei der Entwicklung mit Anwendungsparts sind HTTP-404-Fehler nicht ungewöhnlich. Diese Fehler werden in der Regel dadurch verursacht, dass eine essenzielle Anforderung an die Ermittlung von Anwendungsparts nicht erfüllt ist. Wenn Ihre App einen HTTP-404-Fehler zurückgibt, überprüfen Sie, ob die folgenden Anforderungen erfüllt sind:
- Die
applicationName
-Einstellungen müssen auf die Stammassembly festgelegt sein, die für die Ermittlung verwendet wird. Die für die Ermittlung verwendete Stammassembly ist normalerweise die Einstiegspunktassembly. - Die Stammassembly muss einen Verweis auf das für die Ermittlung verwendete Part enthalten. Der Verweis kann direkt oder transitiv sein.
- Die Stammassembly muss auf das Web-SDK verweisen.
- Das ASP.NET Core-Framework verfügt über eine benutzerdefinierte Logik, die Attribute in die Stammassembly einfügt, die für die Ermittlung verwendet werden.