Compartir a través de


Uso compartido de controladores, vistas, Razor Pages y mucho más con los elementos de aplicación

Por Rick Anderson

Vea o descargue el código de ejemplo (cómo descargarlo)

Un elemento de aplicación es una abstracción sobre los recursos de una aplicación. Los elementos de aplicación permiten a ASP.NET Core descubrir controladores, ver componentes, asistentes de etiquetas, páginas de Razor, orígenes de compilación de razor y mucho más. AssemblyPart es un elemento de una aplicación. AssemblyPart encapsula una referencia de ensamblado y expone los tipos y las referencias de compilación.

Los proveedores de características trabajan con los elementos de aplicación para rellenar las características de una aplicación de ASP.NET Core. El caso de uso principal de los elementos de aplicación es configurar una aplicación para detectar (o evitar cargar) características de ASP.NET Core de un ensamblado. Por ejemplo, puede que desee compartir la funcionalidad común entre varias aplicaciones. Mediante el uso de elementos de aplicación, puedes compartir un ensamblado (DLL) que contenga controladores, vistas, páginas de Razor, orígenes de compilación de razor, asistentes de etiquetas, y mucho más, con varias aplicaciones. Es preferible compartir un ensamblado a duplicar el código en varios proyectos.

Las aplicaciones ASP.NET Core cargan características de ApplicationPart. La clase AssemblyPart representa un elemento de aplicación que está respaldado por un ensamblado.

Carga de características de ASP.NET Core

Use las clases Microsoft.AspNetCore.Mvc.ApplicationParts y AssemblyPart para detectar y cargar características de ASP.NET Core (controladores, componentes de vista, etc.). ApplicationPartManager realiza un seguimiento de los elementos de aplicación y los proveedores de características disponibles. ApplicationPartManager se configura en 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)); });
}

El código siguiente proporciona un enfoque alternativo para configurar ApplicationPartManager mediante 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));
}

Los dos ejemplos de código anteriores cargan SharedController de un ensamblado. SharedController no se encuentra en el proyecto de la aplicación. Vea la descarga de ejemplo de la solución WebAppParts.

Inclusión de vistas

Use una biblioteca de clases de Razor para incluir vistas en el ensamblado.

Impedimento de la carga de los recursos

Los elementos de aplicación se pueden usar para evitar la carga de recursos en un ensamblado o ubicación en concreto. Agregue o quite miembros de la colección Microsoft.AspNetCore.Mvc.ApplicationParts para ocultar los recursos o hacer que estos estén disponibles. El orden de las entradas de la colección ApplicationParts es irrelevante. Configure ApplicationPartManager antes de usarlo para configurar los servicios en el contenedor. Por ejemplo, configure ApplicationPartManager antes de invocar a AddControllersAsServices. Llame a Remove en la colección ApplicationParts para quitar un recurso.

ApplicationPartManager incluye elementos para:

  • El ensamblado de la aplicación y los ensamblados dependientes.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Proveedores de características

Los proveedores de características de la aplicación examinan los elementos de aplicación y proporcionan características para esos elementos. Existen proveedores de características integrados para las siguientes características de ASP.NET Core:

Los proveedores de características heredan de IApplicationFeatureProvider<TFeature>, donde T es el tipo de la característica. Los proveedores de características se pueden implementar para cualquiera de los tipos de características enumerados anteriormente. El orden de los proveedores de características en ApplicationPartManager.FeatureProviders puede afectar al comportamiento en tiempo de ejecución. Los proveedores agregados posteriormente pueden reaccionar ante las acciones realizadas por los proveedores agregados anteriormente.

muestra de las características disponibles

Las características disponibles para una aplicación se pueden enumerar solicitando ApplicationPartManager a través de la inserción de dependencias:

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

El ejemplo de descarga usa el código anterior para mostrar las características de la aplicación:

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

Detección en elementos de aplicaciones

Los errores HTTP 404 no son frecuentes cuando se usan elementos de aplicaciones para el desarrollo. Normalmente, estos errores se producen porque falta un requisito esencial sobre cómo se detectan los elementos de aplicaciones. Si la aplicación devuelve un error HTTP 404, verifique que se cumplen los siguientes requisitos:

  • La configuración applicationName debe establecerse en el ensamblado raíz que se usa para la detección. El ensamblado raíz que se usa para la detección suele ser el ensamblado del punto de entrada.
  • El ensamblado raíz debe tener una referencia a las partes que se usan para la detección. La referencia puede ser directa o transitiva.
  • El ensamblado raíz debe hacer referencia al SDK web. El marco tiene una lógica que marca atributos en el ensamblado raíz que se usan para la detección.

Por Rick Anderson

Vea o descargue el código de ejemplo (cómo descargarlo)

Un elemento de aplicación es una abstracción sobre los recursos de una aplicación. Los elementos de aplicación permiten a ASP.NET Core descubrir controladores, ver componentes, asistentes de etiquetas, páginas de Razor, orígenes de compilación de razor y mucho más. AssemblyPart es un elemento de una aplicación. AssemblyPart encapsula una referencia de ensamblado y expone los tipos y las referencias de compilación.

Los proveedores de características trabajan con los elementos de aplicación para rellenar las características de una aplicación de ASP.NET Core. El caso de uso principal de los elementos de aplicación es configurar una aplicación para detectar (o evitar cargar) características de ASP.NET Core de un ensamblado. Por ejemplo, puede que desee compartir la funcionalidad común entre varias aplicaciones. Mediante el uso de elementos de aplicación, puedes compartir un ensamblado (DLL) que contenga controladores, vistas, páginas de Razor, orígenes de compilación de razor, asistentes de etiquetas, y mucho más, con varias aplicaciones. Es preferible compartir un ensamblado a duplicar el código en varios proyectos.

Las aplicaciones ASP.NET Core cargan características de ApplicationPart. La clase AssemblyPart representa un elemento de aplicación que está respaldado por un ensamblado.

Carga de características de ASP.NET Core

Use las clases ApplicationPart y AssemblyPart para detectar y cargar características de ASP.NET Core (controladores, componentes de vista, etc.). ApplicationPartManager realiza un seguimiento de los elementos de aplicación y los proveedores de características disponibles. ApplicationPartManager se configura en 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);
}

El código siguiente proporciona un enfoque alternativo para configurar ApplicationPartManager mediante 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);
}

Los dos ejemplos de código anteriores cargan SharedController de un ensamblado. SharedController no está en el proyecto de la aplicación. Vea la descarga de ejemplo de la solución WebAppParts.

Inclusión de vistas

Use una biblioteca de clases de Razor para incluir vistas en el ensamblado.

Impedimento de la carga de los recursos

Los elementos de aplicación se pueden usar para evitar la carga de recursos en un ensamblado o ubicación en concreto. Agregue o quite miembros de la colección Microsoft.AspNetCore.Mvc.ApplicationParts para ocultar los recursos o hacer que estos estén disponibles. El orden de las entradas de la colección ApplicationParts es irrelevante. Configure ApplicationPartManager antes de usarlo para configurar los servicios en el contenedor. Por ejemplo, configure ApplicationPartManager antes de invocar a AddControllersAsServices. Llame a Remove en la colección ApplicationParts para quitar un recurso.

En el código siguiente se usa Microsoft.AspNetCore.Mvc.ApplicationParts para quitar MyDependentLibrary de la aplicación:

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 incluye elementos para:

  • El ensamblado de la aplicación y los ensamblados dependientes.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Proveedores de características de la aplicación

Los proveedores de características de la aplicación examinan los elementos de aplicación y proporcionan características para esos elementos. Existen proveedores de características integrados para las siguientes características de ASP.NET Core:

Los proveedores de características heredan de IApplicationFeatureProvider<TFeature>, donde T es el tipo de la característica. Los proveedores de características se pueden implementar para cualquiera de los tipos de características enumerados anteriormente. El orden de los proveedores de características en ApplicationPartManager.FeatureProviders puede afectar al comportamiento en tiempo de ejecución. Los proveedores agregados posteriormente pueden reaccionar ante las acciones realizadas por los proveedores agregados anteriormente.

muestra de las características disponibles

Las características disponibles para una aplicación se pueden enumerar solicitando ApplicationPartManager a través de la inserción de dependencias:

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

El ejemplo de descarga usa el código anterior para mostrar las características de la aplicación:

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

Detección en elementos de aplicaciones

Los errores HTTP 404 no son frecuentes cuando se usan elementos de aplicaciones para el desarrollo. Normalmente, estos errores se producen porque falta un requisito esencial sobre cómo se detectan los elementos de aplicaciones. Si la aplicación devuelve un error HTTP 404, verifique que se cumplen los siguientes requisitos:

  • La configuración applicationName debe establecerse en el ensamblado raíz que se usa para la detección. El ensamblado raíz que se usa para la detección suele ser el ensamblado del punto de entrada.
  • El ensamblado raíz debe tener una referencia a las partes que se usan para la detección. La referencia puede ser directa o transitiva.
  • El ensamblado raíz debe hacer referencia al SDK web.
    • El marco de ASP.NET Core tiene una lógica de compilación personalizada que marca atributos en el ensamblado raíz que se usan para la detección.