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 Anwendungsparts 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:

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 Anwendungsparts 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.