Partilhar via


Partilhe controladores, vistas, Razor Páginas e muito mais com Application Parts

Por Rick Anderson

Ver ou descarregar código de amostra (como descarregar)

Um Application Part é uma abstração sobre os recursos de um aplicativo. As Peças de Aplicação permitem que o ASP.NET Core descubra controladores, visualize componentes, auxiliares de tags, páginas de Razor, fontes de compilação de navalha e muito mais. AssemblyPart é uma parte do aplicativo. AssemblyPart encapsula uma referência de assembly e expõe tipos e referências de compilação.

Os provedores de funcionalidades trabalham com partes de aplicação para preencher as funcionalidades de uma aplicação ASP.NET Core. O principal caso de uso para partes de aplicação é configurar uma aplicação para descobrir (ou evitar carregar) recursos do ASP.NET Core de um assembly. Por exemplo, talvez você queira compartilhar funcionalidades comuns entre vários aplicativos. Usando o Application Parts, é possível compartilhar um assembly (DLL) que contém controladores, views, Razor Pages, fontes de compilação Razor, Tag Helpers e muito mais com várias aplicações. O compartilhamento de um assembly é preferível à duplicação de código em vários projetos.

ASP.NET Core apps carregam funcionalidades de ApplicationPart. A classe AssemblyPart representa uma parte da aplicação que é suportada por um assembly.

Carregar funcionalidades do ASP.NET Core

Use as classes Microsoft.AspNetCore.Mvc.ApplicationParts e AssemblyPart para descobrir e carregar ASP.NET recursos principais (controladores, componentes de visualização, etc.). O ApplicationPartManager rastreia as partes do aplicativo e os provedores de recursos disponíveis. ApplicationPartManager está configurado em 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)); });
}

O código a seguir fornece uma abordagem alternativa para configurar ApplicationPartManager usando 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));
}

Os dois exemplos de código anteriores carregam o SharedController de uma assemblagem. O SharedController não está no projeto do aplicativo. Veja o download do exemplo de solução WebAppParts .

Incluir vistas

Use uma biblioteca de classes Razor para incluir vistas no assembly.

Impedir o carregamento de recursos

As peças de aplicação podem ser usadas para evitar o carregamento de recursos em uma determinada assemblagem ou localização. Adicione ou remova membros da coleção Microsoft.AspNetCore.Mvc.ApplicationParts para ocultar ou disponibilizar recursos. A ordem das entradas na coleção ApplicationParts não é importante. Configure o ApplicationPartManager antes de usá-lo para configurar serviços no contêiner. Por exemplo, configure o ApplicationPartManager antes de invocar AddControllersAsServices. Chame Remove na coleção ApplicationParts para remover um recurso.

O ApplicationPartManager inclui peças para:

  • A montagem do aplicativo e montagens dependentes.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Fornecedores de funcionalidades

Os provedores de recursos de aplicativos examinam as partes do aplicativo e fornecem recursos para essas partes. Existem fornecedores de funcionalidades incorporados para as seguintes funcionalidades ASP.NET Core:

Os provedores de recursos herdam de IApplicationFeatureProvider<TFeature>, onde T é o tipo do recurso. Os provedores de recursos podem ser implementados para qualquer um dos tipos de recursos listados anteriormente. A ordem dos provedores de recursos no ApplicationPartManager.FeatureProviders pode afetar o comportamento do tempo de execução. Provedores adicionados posteriormente podem reagir a ações tomadas por provedores adicionados anteriormente.

Exibir recursos disponíveis

Os recursos disponíveis para uma aplicação podem ser enumerados ao solicitar uma injeção de dependência ApplicationPartManager através de .

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

A amostra de download usa o código anterior para exibir as funcionalidades da aplicação.

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

Descoberta nas partes da aplicação

Erros HTTP 404 não são incomuns ao desenvolver com partes do aplicativo. Esses erros geralmente são causados pela falta de um requisito essencial para como as partes dos aplicativos são descobertas. Se seu aplicativo retornar um erro HTTP 404, verifique se os seguintes requisitos foram atendidos:

  • A configuração applicationName precisa ser definida como o assembly raiz usado para a descoberta. A assemblagem raiz usada para descoberta é normalmente a assemblagem do ponto de entrada.
  • O conjunto raiz precisa ter uma referência às partes usadas para a descoberta. A referência pode ser direta ou transitiva.
  • A assemblagem raiz precisa fazer referência ao SDK da Web. A estrutura possui lógica que insere atributos no assembly raiz que são usados para detecção.

Por Rick Anderson

Ver ou descarregar código de amostra (como descarregar)

Um Application Part é uma abstração sobre os recursos de um aplicativo. As Peças de Aplicação permitem que o ASP.NET Core descubra controladores, visualize componentes, auxiliares de tags, páginas de Razor, fontes de compilação de navalha e muito mais. AssemblyPart é uma parte do aplicativo. AssemblyPart encapsula uma referência de assembly e expõe tipos e referências de compilação.

Os provedores de funcionalidades trabalham com partes de aplicação para preencher as funcionalidades de uma aplicação ASP.NET Core. O principal caso de uso para partes de aplicação é configurar uma aplicação para descobrir (ou evitar carregar) recursos do ASP.NET Core de um assembly. Por exemplo, talvez você queira compartilhar funcionalidades comuns entre vários aplicativos. Usando o Application Parts, é possível compartilhar um assembly (DLL) que contém controladores, views, Razor Pages, fontes de compilação Razor, Tag Helpers e muito mais com várias aplicações. O compartilhamento de um assembly é preferível à duplicação de código em vários projetos.

ASP.NET Core apps carregam funcionalidades de ApplicationPart. A classe AssemblyPart representa uma parte da aplicação que é suportada por um assembly.

Carregar funcionalidades do ASP.NET Core

Use as classes ApplicationPart e AssemblyPart para descobrir e carregar ASP.NET recursos principais (controladores, componentes de visualização, etc.). O ApplicationPartManager rastreia as partes do aplicativo e os provedores de recursos disponíveis. ApplicationPartManager está configurado em 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);
}

O código a seguir fornece uma abordagem alternativa para configurar ApplicationPartManager usando 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);
}

Os dois exemplos de código anteriores carregam o SharedController de uma assemblagem. O SharedController não está no projeto do aplicativo. Veja o download do exemplo de solução WebAppParts .

Incluir vistas

Use uma biblioteca de classes Razor para incluir vistas no assembly.

Impedir o carregamento de recursos

As peças de aplicação podem ser usadas para evitar o carregamento de recursos em uma determinada assemblagem ou localização. Adicione ou remova membros da coleção Microsoft.AspNetCore.Mvc.ApplicationParts para ocultar ou disponibilizar recursos. A ordem das entradas na coleção ApplicationParts não é importante. Configure o ApplicationPartManager antes de usá-lo para configurar serviços no contêiner. Por exemplo, configure o ApplicationPartManager antes de invocar AddControllersAsServices. Chame Remove na coleção ApplicationParts para remover um recurso.

O código a seguir usa Microsoft.AspNetCore.Mvc.ApplicationParts para remover MyDependentLibrary do aplicativo:

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

O ApplicationPartManager inclui peças para:

  • A montagem do aplicativo e montagens dependentes.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Provedores de recursos de aplicativos

Os provedores de recursos de aplicativos examinam as partes do aplicativo e fornecem recursos para essas partes. Existem fornecedores de funcionalidades incorporados para as seguintes funcionalidades ASP.NET Core:

Os provedores de recursos herdam de IApplicationFeatureProvider<TFeature>, onde T é o tipo do recurso. Os provedores de recursos podem ser implementados para qualquer um dos tipos de recursos listados anteriormente. A ordem dos provedores de recursos no ApplicationPartManager.FeatureProviders pode afetar o comportamento do tempo de execução. Provedores adicionados posteriormente podem reagir a ações tomadas por provedores adicionados anteriormente.

Exibir recursos disponíveis

Os recursos disponíveis para uma aplicação podem ser enumerados ao solicitar uma injeção de dependência ApplicationPartManager através de .

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

A amostra de download usa o código anterior para exibir as funcionalidades da aplicação.

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

Descoberta nas partes da aplicação

Erros HTTP 404 não são incomuns ao desenvolver com partes do aplicativo. Esses erros geralmente são causados pela falta de um requisito essencial para como as partes dos aplicativos são descobertas. Se seu aplicativo retornar um erro HTTP 404, verifique se os seguintes requisitos foram atendidos:

  • A configuração applicationName precisa ser definida como o assembly raiz usado para a descoberta. A assemblagem raiz usada para descoberta é normalmente a assemblagem do ponto de entrada.
  • O conjunto raiz precisa ter uma referência às partes usadas para a descoberta. A referência pode ser direta ou transitiva.
  • A assemblagem raiz precisa fazer referência ao SDK da Web.
    • A estrutura ASP.NET Core tem lógica de compilação personalizada que carimba atributos no assembly raiz que são usados para descoberta.