Udostępnianie kontrolerów, widoków, Razor stron i innych elementów z częściami aplikacji

Autor: Rick Anderson

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Część aplikacji to abstrakcja zasobów aplikacji. Części aplikacji umożliwiają ASP.NET Core odnajdywanie kontrolerów, wyświetlanie składników, pomocników tagów, Razor stron, źródeł kompilacji razor i nie tylko. AssemblyPart jest częścią aplikacji. AssemblyPart Hermetyzuje odwołanie do zestawu i uwidacznia typy i odwołania kompilacji.

Dostawcy funkcji współpracują z częściami aplikacji, aby wypełnić funkcje aplikacji ASP.NET Core. Głównym przypadkiem użycia części aplikacji jest skonfigurowanie aplikacji do odnajdywania (lub unikania ładowania) ASP.NET podstawowych funkcji zestawu. Na przykład możesz chcieć udostępnić typowe funkcje między wieloma aplikacjami. Za pomocą części aplikacji można udostępniać zestaw (DLL) zawierający kontrolery, widoki, Razor strony, źródła kompilacji razor, pomocniki tagów i inne aplikacje. Udostępnianie zestawu jest preferowane do duplikowania kodu w wielu projektach.

aplikacje ASP.NET Core ładują funkcje z witryny ApplicationPart. Klasa AssemblyPart reprezentuje część aplikacji, która jest wspierana przez zestaw.

Ładowanie funkcji ASP.NET Core

Microsoft.AspNetCore.Mvc.ApplicationParts Użyj klas iAssemblyPart, aby odnajdywać i ładować funkcje ASP.NET Core (kontrolery, składniki widoku itp.). Śledzi ApplicationPartManager dostępne części aplikacji i dostawców funkcji. ApplicationPartManager program jest skonfigurowany w programie 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)); });
}

Poniższy kod zapewnia alternatywne podejście do konfigurowania ApplicationPartManager przy użyciu polecenia 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));
}

Poprzednie dwa przykłady kodu ładują element SharedController z zestawu. Element SharedController nie znajduje się w projekcie aplikacji. Zobacz przykładowe pobieranie rozwiązania WebAppParts.

Uwzględnij widoki

Razor Użyj biblioteki klas, aby uwzględnić widoki w zestawie.

Zapobieganie ładowaniu zasobów

Części aplikacji mogą służyć do unikania ładowania zasobów w określonym zestawie lub lokalizacji. Dodaj lub usuń elementy członkowskie kolekcji, Microsoft.AspNetCore.Mvc.ApplicationParts aby ukryć lub udostępnić zasoby. Kolejność wpisów w ApplicationParts kolekcji nie jest ważna. Skonfiguruj usługę ApplicationPartManager przed jej użyciem, aby skonfigurować usługi w kontenerze. Na przykład skonfiguruj element ApplicationPartManager przed wywołaniem AddControllersAsServicesmetody . Wywołaj Remove metodę w kolekcji, ApplicationParts aby usunąć zasób.

Zawiera ApplicationPartManager części dla:

  • Zestawy i zależne aplikacji.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Dostawcy funkcji

Dostawcy funkcji aplikacji badają części aplikacji i udostępniają funkcje dla tych części. Istnieją wbudowane dostawcy funkcji dla następujących funkcji ASP.NET Core:

Dostawcy funkcji dziedziczą z IApplicationFeatureProvider<TFeature>klasy , gdzie T jest typem funkcji. Dostawcy funkcji można zaimplementować dla dowolnego z wymienionych wcześniej typów funkcji. Kolejność dostawców funkcji w programie ApplicationPartManager.FeatureProviders może mieć wpływ na zachowanie czasu wykonywania. Później dodani dostawcy mogą reagować na działania podejmowane przez wcześniejszych dodanych dostawców.

Wyświetlanie dostępnych funkcji

Funkcje dostępne dla aplikacji można wyliczyć, żądając ApplicationPartManager iniekcji zależności:

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

Przykład pobierania używa powyższego kodu do wyświetlania funkcji aplikacji:

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

Odnajdywanie w częściach aplikacji

Błędy HTTP 404 nie są rzadkością podczas opracowywania z częściami aplikacji. Te błędy są zwykle spowodowane brakiem podstawowego wymagania dotyczącego sposobu odnajdywanego części aplikacji. Jeśli aplikacja zwraca błąd HTTP 404, sprawdź, czy zostały spełnione następujące wymagania:

  • Ustawienie applicationName musi być ustawione na zestaw główny używany do odnajdywania. Zestaw główny używany do odnajdywania jest zwykle zestawem punktu wejścia.
  • Zestaw główny musi mieć odwołanie do części używanych do odnajdywania. Odwołanie może być bezpośrednie lub przechodnie.
  • Zestaw główny musi odwoływać się do zestawu WEB SDK. Struktura ma logikę, która oznacza atrybuty do zestawu głównego, który jest używany do odnajdywania.

Autor: Rick Anderson

Wyświetl lub pobierz przykładowy kod (jak pobrać)

Część aplikacji to abstrakcja zasobów aplikacji. Części aplikacji umożliwiają ASP.NET Core odnajdywanie kontrolerów, wyświetlanie składników, pomocników tagów, Razor stron, źródeł kompilacji razor i nie tylko. AssemblyPart jest częścią aplikacji. AssemblyPart Hermetyzuje odwołanie do zestawu i uwidacznia typy i odwołania kompilacji.

Dostawcy funkcji współpracują z częściami aplikacji, aby wypełnić funkcje aplikacji ASP.NET Core. Głównym przypadkiem użycia części aplikacji jest skonfigurowanie aplikacji do odnajdywania (lub unikania ładowania) ASP.NET podstawowych funkcji zestawu. Na przykład możesz chcieć udostępnić typowe funkcje między wieloma aplikacjami. Za pomocą części aplikacji można udostępniać zestaw (DLL) zawierający kontrolery, widoki, Razor strony, źródła kompilacji razor, pomocniki tagów i inne aplikacje. Udostępnianie zestawu jest preferowane do duplikowania kodu w wielu projektach.

aplikacje ASP.NET Core ładują funkcje z witryny ApplicationPart. Klasa AssemblyPart reprezentuje część aplikacji, która jest wspierana przez zestaw.

Ładowanie funkcji ASP.NET Core

ApplicationPart Użyj klas iAssemblyPart, aby odnajdywać i ładować funkcje ASP.NET Core (kontrolery, składniki widoku itp.). Śledzi ApplicationPartManager dostępne części aplikacji i dostawców funkcji. ApplicationPartManager program jest skonfigurowany w programie 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);
}

Poniższy kod zapewnia alternatywne podejście do konfigurowania ApplicationPartManager przy użyciu polecenia 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);
}

Poprzednie dwa przykłady kodu ładują element SharedController z zestawu. Element SharedController nie znajduje się w projekcie aplikacji. Zobacz przykładowe pobieranie rozwiązania WebAppParts.

Uwzględnij widoki

Razor Użyj biblioteki klas, aby uwzględnić widoki w zestawie.

Zapobieganie ładowaniu zasobów

Części aplikacji mogą służyć do unikania ładowania zasobów w określonym zestawie lub lokalizacji. Dodaj lub usuń elementy członkowskie kolekcji, Microsoft.AspNetCore.Mvc.ApplicationParts aby ukryć lub udostępnić zasoby. Kolejność wpisów w ApplicationParts kolekcji nie jest ważna. Skonfiguruj usługę ApplicationPartManager przed jej użyciem, aby skonfigurować usługi w kontenerze. Na przykład skonfiguruj element ApplicationPartManager przed wywołaniem AddControllersAsServicesmetody . Wywołaj Remove metodę w kolekcji, ApplicationParts aby usunąć zasób.

Poniższy kod używa Microsoft.AspNetCore.Mvc.ApplicationParts polecenia do usunięcia MyDependentLibrary z aplikacji:

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

Zawiera ApplicationPartManager części dla:

  • Zestawy i zależne aplikacji.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Dostawcy funkcji aplikacji

Dostawcy funkcji aplikacji badają części aplikacji i udostępniają funkcje dla tych części. Istnieją wbudowane dostawcy funkcji dla następujących funkcji ASP.NET Core:

Dostawcy funkcji dziedziczą z IApplicationFeatureProvider<TFeature>klasy , gdzie T jest typem funkcji. Dostawcy funkcji można zaimplementować dla dowolnego z wymienionych wcześniej typów funkcji. Kolejność dostawców funkcji w programie ApplicationPartManager.FeatureProviders może mieć wpływ na zachowanie czasu wykonywania. Później dodani dostawcy mogą reagować na działania podejmowane przez wcześniejszych dodanych dostawców.

Wyświetlanie dostępnych funkcji

Funkcje dostępne dla aplikacji można wyliczyć, żądając ApplicationPartManager iniekcji zależności:

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

Przykład pobierania używa powyższego kodu do wyświetlania funkcji aplikacji:

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

Odnajdywanie w częściach aplikacji

Błędy HTTP 404 nie są rzadkością podczas opracowywania z częściami aplikacji. Te błędy są zwykle spowodowane brakiem podstawowego wymagania dotyczącego sposobu odnajdywanego części aplikacji. Jeśli aplikacja zwraca błąd HTTP 404, sprawdź, czy zostały spełnione następujące wymagania:

  • Ustawienie applicationName musi być ustawione na zestaw główny używany do odnajdywania. Zestaw główny używany do odnajdywania jest zwykle zestawem punktu wejścia.
  • Zestaw główny musi mieć odwołanie do części używanych do odnajdywania. Odwołanie może być bezpośrednie lub przechodnie.
  • Zestaw główny musi odwoływać się do zestawu WEB SDK.
    • Platforma ASP.NET Core ma niestandardową logikę kompilacji, która oznacza atrybuty do zestawu głównego używanego do odnajdywania.