Sdílení kontrolerů, zobrazení, Razor stránek a dalších prvků pomocí částí aplikace

Autor: Rick Anderson

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Část aplikace je abstrakce prostředků aplikace. Části aplikace umožňují ASP.NET Core zjišťovat kontrolery, zobrazovat komponenty, pomocné rutiny značek, Razor stránky, zdroje kompilace razor a další. AssemblyPart je součástí aplikace. AssemblyPart zapouzdřuje odkaz na sestavení a zveřejňuje typy a odkazy na kompilaci.

Poskytovatelé funkcí pracují s částmi aplikací a naplňují funkce aplikace ASP.NET Core. Hlavním případem použití částí aplikace je konfigurace aplikace, která zjišťuje (nebo se nenačítá) ASP.NET základních funkcí ze sestavení. Můžete například chtít sdílet společné funkce mezi více aplikacemi. Pomocí částí aplikace můžete sdílet sestavení (DLL) obsahující kontrolery, zobrazení, Razor stránky, zdroje kompilace razor, pomocné rutiny značek a další s více aplikacemi. Sdílení sestavení je upřednostňované k duplikování kódu ve více projektech.

ASP.NET základní aplikace načítají funkce z ApplicationPart. Třída AssemblyPart představuje aplikační část, která je podporována sestavením.

Načtení funkcí ASP.NET Core

Microsoft.AspNetCore.Mvc.ApplicationParts Pomocí a AssemblyPart tříd můžete zjišťovat a načítat základní funkce ASP.NET (kontrolery, zobrazení komponent atd.). Sleduje ApplicationPartManager dostupné části aplikace a poskytovatele funkcí. ApplicationPartManager je nakonfigurován v Startup.ConfigureServices:

// 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)); });
}

Následující kód nabízí alternativní přístup ke konfiguraci ApplicationPartManager pomocí AssemblyPart:

// 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));
}

Předchozí dva ukázky kódu načtou SharedController ze sestavení. Není SharedController v projektu aplikace. Podívejte se na ukázkové stažení řešení WebAppParts.

Zahrnout zobrazení

K zahrnutí zobrazení do sestavení použijte knihovnu Razor tříd.

Zabránění načítání prostředků

Části aplikace lze použít k tomu, aby se zabránilo načítání prostředků v určitém sestavení nebo umístění. Přidejte nebo odeberte členy Microsoft.AspNetCore.Mvc.ApplicationParts kolekce a skryjte nebo zpřístupňujte prostředky. Pořadí položek v kolekci ApplicationParts není důležité. ApplicationPartManager Nakonfigurujte službu před použitím ke konfiguraci služeb v kontejneru. Například nakonfigurujte ApplicationPartManager před vyvoláním AddControllersAsServices. Voláním RemoveApplicationParts kolekce odeberte prostředek.

Mezi ApplicationPartManager tyto části patří:

  • Sestavení a závislá sestavení aplikace.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Poskytovatelé funkcí

Poskytovatelé funkcí aplikací prověřují části aplikací a poskytují funkce pro tyto části. Existují integrovaní poskytovatelé funkcí pro následující funkce ASP.NET Core:

Poskytovatelé funkcí dědí z IApplicationFeatureProvider<TFeature>, kde T je typ funkce. Poskytovatelé funkcí je možné implementovat pro kterýkoli z dříve uvedených typů funkcí. Pořadí poskytovatelů funkcí v běhu ApplicationPartManager.FeatureProviders může mít vliv na chování doby běhu. Později přidaní poskytovatelé můžou reagovat na akce provedené dříve přidanými poskytovateli.

Zobrazení dostupných funkcí

Funkce dostupné pro aplikaci je možné vyčíslit vyžádáním ApplicationPartManagerinjektáže závislostí:

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);
        }
    }
}

Ukázka stahování používá předchozí kód k zobrazení funkcí aplikace:

Controllers:
    - FeaturesController
    - HomeController
    - HelloController
    - GenericController`1
    - GenericController`1
Tag Helpers:
    - PrerenderTagHelper
    - AnchorTagHelper
    - CacheTagHelper
    - DistributedCacheTagHelper
    - EnvironmentTagHelper
    - Additional Tag Helpers omitted for brevity.
View Components:
    - SampleViewComponent

Zjišťování v částech aplikace

Chyby HTTP 404 nejsou neobvyklé při vývoji částí aplikace. Tyto chyby jsou obvykle způsobeny chybějícím základním požadavkem na zjištění částí aplikací. Pokud vaše aplikace vrátí chybu HTTP 404, ověřte splnění následujících požadavků:

  • Nastavení applicationName musí být nastaveno na kořenové sestavení použité ke zjišťování. Kořenové sestavení používané ke zjišťování je obvykle sestavení vstupního bodu.
  • Kořenové sestavení musí mít odkaz na části používané ke zjišťování. Odkaz může být přímý nebo tranzitivní.
  • Kořenové sestavení musí odkazovat na webovou sadu SDK. Architektura má logiku, která zapisuje atributy do kořenového sestavení, které se používají ke zjišťování.

Autor: Rick Anderson

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Část aplikace je abstrakce prostředků aplikace. Části aplikace umožňují ASP.NET Core zjišťovat kontrolery, zobrazovat komponenty, pomocné rutiny značek, Razor stránky, zdroje kompilace razor a další. AssemblyPart je součástí aplikace. AssemblyPart zapouzdřuje odkaz na sestavení a zveřejňuje typy a odkazy na kompilaci.

Poskytovatelé funkcí pracují s částmi aplikací a naplňují funkce aplikace ASP.NET Core. Hlavním případem použití částí aplikace je konfigurace aplikace, která zjišťuje (nebo se nenačítá) ASP.NET základních funkcí ze sestavení. Můžete například chtít sdílet společné funkce mezi více aplikacemi. Pomocí částí aplikace můžete sdílet sestavení (DLL) obsahující kontrolery, zobrazení, Razor stránky, zdroje kompilace razor, pomocné rutiny značek a další s více aplikacemi. Sdílení sestavení je upřednostňované k duplikování kódu ve více projektech.

ASP.NET základní aplikace načítají funkce z ApplicationPart. Třída AssemblyPart představuje aplikační část, která je podporována sestavením.

Načtení funkcí ASP.NET Core

ApplicationPart Pomocí a AssemblyPart tříd můžete zjišťovat a načítat základní funkce ASP.NET (kontrolery, zobrazení komponent atd.). Sleduje ApplicationPartManager dostupné části aplikace a poskytovatele funkcí. ApplicationPartManager je nakonfigurován v Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    // Requires using System.Reflection;
    var assembly = typeof(MySharedController).GetTypeInfo().Assembly;
    services.AddMvc()
        .AddApplicationPart(assembly)
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Následující kód nabízí alternativní přístup ke konfiguraci ApplicationPartManager pomocí AssemblyPart:

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);
}

Předchozí dva ukázky kódu načtou SharedController ze sestavení. Není SharedController v projektu aplikace. Podívejte se na ukázkové stažení řešení WebAppParts.

Zahrnout zobrazení

K zahrnutí zobrazení do sestavení použijte knihovnu Razor tříd.

Zabránění načítání prostředků

Části aplikace lze použít k tomu, aby se zabránilo načítání prostředků v určitém sestavení nebo umístění. Přidejte nebo odeberte členy Microsoft.AspNetCore.Mvc.ApplicationParts kolekce a skryjte nebo zpřístupňujte prostředky. Pořadí položek v kolekci ApplicationParts není důležité. ApplicationPartManager Nakonfigurujte službu před použitím ke konfiguraci služeb v kontejneru. Například nakonfigurujte ApplicationPartManager před vyvoláním AddControllersAsServices. Voláním RemoveApplicationParts kolekce odeberte prostředek.

Následující kód se používá Microsoft.AspNetCore.Mvc.ApplicationParts k odebrání MyDependentLibrary z aplikace:

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);
                }
            });
}

Mezi ApplicationPartManager tyto části patří:

  • Sestavení a závislá sestavení aplikace.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Poskytovatelé funkcí aplikací

Poskytovatelé funkcí aplikací prověřují části aplikací a poskytují funkce pro tyto části. Existují integrovaní poskytovatelé funkcí pro následující funkce ASP.NET Core:

Poskytovatelé funkcí dědí z IApplicationFeatureProvider<TFeature>, kde T je typ funkce. Poskytovatelé funkcí je možné implementovat pro kterýkoli z dříve uvedených typů funkcí. Pořadí poskytovatelů funkcí v běhu ApplicationPartManager.FeatureProviders může mít vliv na chování doby běhu. Později přidaní poskytovatelé můžou reagovat na akce provedené dříve přidanými poskytovateli.

Zobrazení dostupných funkcí

Funkce dostupné pro aplikaci je možné vyčíslit vyžádáním ApplicationPartManagerinjektáže závislostí:

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);
        }
    }
}

Ukázka stahování používá předchozí kód k zobrazení funkcí aplikace:

Controllers:
    - FeaturesController
    - HomeController
    - HelloController
    - GenericController`1
    - GenericController`1
Tag Helpers:
    - PrerenderTagHelper
    - AnchorTagHelper
    - CacheTagHelper
    - DistributedCacheTagHelper
    - EnvironmentTagHelper
    - Additional Tag Helpers omitted for brevity.
View Components:
    - SampleViewComponent

Zjišťování v částech aplikace

Chyby HTTP 404 nejsou neobvyklé při vývoji částí aplikace. Tyto chyby jsou obvykle způsobeny chybějícím základním požadavkem na zjištění částí aplikací. Pokud vaše aplikace vrátí chybu HTTP 404, ověřte splnění následujících požadavků:

  • Nastavení applicationName musí být nastaveno na kořenové sestavení použité ke zjišťování. Kořenové sestavení používané ke zjišťování je obvykle sestavení vstupního bodu.
  • Kořenové sestavení musí mít odkaz na části používané ke zjišťování. Odkaz může být přímý nebo tranzitivní.
  • Kořenové sestavení musí odkazovat na webovou sadu SDK.
    • Architektura ASP.NET Core má vlastní logiku sestavení, která zapisuje atributy do kořenového sestavení, které se používají ke zjišťování.