Совместное использование контроллеров, представлений, Razor страниц и многое другое с частями приложения

Автор: Рик Андерсон (Rick Anderson)

Просмотреть или скачать образец кода (описание загрузки)

Часть приложения — это абстракция для ресурсов приложения. Части приложений позволяют ASP.NET Core обнаруживать контроллеры, просматривать компоненты, вспомогательные функции тегов, Pages, Razor источники компиляции razor и многое другое. AssemblyPart является частью приложения. AssemblyPart инкапсулирует ссылку на сборку и предоставляет типы и ссылки на компиляцию.

Поставщики компонентов работают с частями приложения для заполнения компонентов приложения ASP.NET Core. Основной вариант использования частей приложения заключается в настройке приложения для обнаружения (или запрета загрузки) компонентов ASP.NET Core из сборки. Например, может потребоваться совместное использование общих функциональных возможностей несколькими приложениями. С помощью частей приложения можно совместно использовать сборку (DLL), содержащую контроллеры, представления, страницы, Razor источники компиляции razor, вспомогательные функции тегов и многое другое с несколькими приложениями. Желательно предоставить общий доступ к сборке для дублирования кода в нескольких проектах.

Приложения ASP.NET Core загружают компоненты из ApplicationPart. Класс AssemblyPart представляет часть приложения, поддерживаемую сборкой.

Загрузка компонентов ASP.NET Core

Используйте классы Microsoft.AspNetCore.Mvc.ApplicationParts и AssemblyPart для обнаружения и загрузки компонентов ASP.NET Core (контроллеры, компоненты представления и т. д.). ApplicationPartManager отслеживает доступные части приложения и поставщики компонентов. Функция ApplicationPartManager настраивается в 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)); });
}

Следующий код предоставляет альтернативный подход к настройке ApplicationPartManager с использованием 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));
}

Предыдущие два примера кода загружают SharedController из сборки. SharedController не находится в проекте приложения. См. пример решения WebAppParts для загрузки.

Включение представлений

Используйте библиотеку Razor классов для включения представлений в сборку.

Запрет загрузки ресурсов

Части приложения можно использовать для запрета загрузки ресурсов в определенной сборке или расположении. Добавьте или удалите элементы Microsoft.AspNetCore.Mvc.ApplicationParts коллекции, чтобы скрыть или сделать доступными ресурсы. Порядок записей в коллекции ApplicationParts не имеет значения. Настройте класс ApplicationPartManager перед его использованием для конфигурации служб в контейнере. Например, настройте класс ApplicationPartManager перед вызовом метода AddControllersAsServices. Вызовите метод Remove в коллекции ApplicationParts, чтобы удалить ресурс.

ApplicationPartManager содержит части для:

  • сборки приложения и зависимых сборок;
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Поставщики компонентов

Поставщики компонентов приложений проверяют части приложения и предоставляют для них компоненты. Доступны встроенные поставщики компонентов для следующих компонентов ASP.NET Core:

Поставщики компонентов наследуют от IApplicationFeatureProvider<TFeature>, где T является типом компонента. Поставщики компонентов можно реализовать для любого из перечисленных выше типов компонентов. Порядок поставщиков компонентов в ApplicationPartManager.FeatureProviders может повлиять на поведение во время выполнения. Поставщики, добавленные позднее, могут реагировать на действия, выполняемые ранее добавленными поставщиками.

отображение доступных компонентов

Компоненты, доступные для приложения, можно перечислить путем запроса ApplicationPartManager с помощью внедрения зависимостей:

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

В примере для скачивания используется приведенный выше код для отображения компонентов приложения:

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

Обнаружение в частях приложения

Ошибки HTTP 404 нередко возникают при разработке с использованием частей приложений. Обычно эти ошибки вызваны отсутствием существенного требования к способу обнаружения частей приложений. Если приложение возвращает ошибку HTTP 404, убедитесь, что выполнены следующие требования:

  • Для параметра applicationName должна быть задана корневая сборка, используемая для обнаружения. Корневая сборка, используемая для обнаружения, обычно является сборкой точки входа.
  • Корневая сборка должна иметь ссылку на части, используемые для обнаружения. Ссылка может быть прямой или транзитивной.
  • Корневая сборка должна ссылаться на веб-пакет SDK. Платформа имеет логику, которая помечает в корневой сборке атрибуты, используемые для обнаружения.

Автор: Рик Андерсон (Rick Anderson)

Просмотреть или скачать образец кода (описание загрузки)

Часть приложения — это абстракция для ресурсов приложения. Части приложений позволяют ASP.NET Core обнаруживать контроллеры, просматривать компоненты, вспомогательные функции тегов, Pages, Razor источники компиляции razor и многое другое. AssemblyPart является частью приложения. AssemblyPart инкапсулирует ссылку на сборку и предоставляет типы и ссылки на компиляцию.

Поставщики компонентов работают с частями приложения для заполнения компонентов приложения ASP.NET Core. Основной вариант использования частей приложения заключается в настройке приложения для обнаружения (или запрета загрузки) компонентов ASP.NET Core из сборки. Например, может потребоваться совместное использование общих функциональных возможностей несколькими приложениями. С помощью частей приложения можно совместно использовать сборку (DLL), содержащую контроллеры, представления, страницы, Razor источники компиляции razor, вспомогательные функции тегов и многое другое с несколькими приложениями. Желательно предоставить общий доступ к сборке для дублирования кода в нескольких проектах.

Приложения ASP.NET Core загружают компоненты из ApplicationPart. Класс AssemblyPart представляет часть приложения, поддерживаемую сборкой.

Загрузка компонентов ASP.NET Core

Используйте классы ApplicationPart и AssemblyPart для обнаружения и загрузки компонентов ASP.NET Core (контроллеры, компоненты представления и т. д.). ApplicationPartManager отслеживает доступные части приложения и поставщики компонентов. Функция ApplicationPartManager настраивается в 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);
}

Следующий код предоставляет альтернативный подход к настройке ApplicationPartManager с использованием 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);
}

Предыдущие два примера кода загружают SharedController из сборки. SharedController не находится в проекте приложения. См. пример решения WebAppParts для загрузки.

Включение представлений

Используйте библиотеку Razor классов для включения представлений в сборку.

Запрет загрузки ресурсов

Части приложения можно использовать для запрета загрузки ресурсов в определенной сборке или расположении. Добавьте или удалите элементы Microsoft.AspNetCore.Mvc.ApplicationParts коллекции, чтобы скрыть или сделать доступными ресурсы. Порядок записей в коллекции ApplicationParts не имеет значения. Настройте класс ApplicationPartManager перед его использованием для конфигурации служб в контейнере. Например, настройте класс ApplicationPartManager перед вызовом метода AddControllersAsServices. Вызовите метод Remove в коллекции ApplicationParts, чтобы удалить ресурс.

Следующий код используется Microsoft.AspNetCore.Mvc.ApplicationParts для удаления MyDependentLibrary из приложения:

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

ApplicationPartManager содержит части для:

  • сборки приложения и зависимых сборок;
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Поставщики компонентов приложений

Поставщики компонентов приложений проверяют части приложения и предоставляют для них компоненты. Доступны встроенные поставщики компонентов для следующих компонентов ASP.NET Core:

Поставщики компонентов наследуют от IApplicationFeatureProvider<TFeature>, где T является типом компонента. Поставщики компонентов можно реализовать для любого из перечисленных выше типов компонентов. Порядок поставщиков компонентов в ApplicationPartManager.FeatureProviders может повлиять на поведение во время выполнения. Поставщики, добавленные позднее, могут реагировать на действия, выполняемые ранее добавленными поставщиками.

отображение доступных компонентов

Компоненты, доступные для приложения, можно перечислить путем запроса ApplicationPartManager с помощью внедрения зависимостей:

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

В примере для скачивания используется приведенный выше код для отображения компонентов приложения:

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

Обнаружение в частях приложения

Ошибки HTTP 404 нередко возникают при разработке с использованием частей приложений. Обычно эти ошибки вызваны отсутствием существенного требования к способу обнаружения частей приложений. Если приложение возвращает ошибку HTTP 404, убедитесь, что выполнены следующие требования:

  • Для параметра applicationName должна быть задана корневая сборка, используемая для обнаружения. Корневая сборка, используемая для обнаружения, обычно является сборкой точки входа.
  • Корневая сборка должна иметь ссылку на части, используемые для обнаружения. Ссылка может быть прямой или транзитивной.
  • Корневая сборка должна ссылаться на веб-пакет SDK.
    • Платформа ASP.NET Core имеет специальную логику, которая помечает в корневой сборке атрибуты, используемые для обнаружения.