Condividere controller, visualizzazioni, Razor pagine e altro ancora con parti dell'applicazione

Di Rick Anderson

Visualizzare o scaricare il codice di esempio (procedura per il download)

Una parte dell'applicazione è un'astrazione sulle risorse di un'app. Le parti dell'applicazione consentono ASP.NET Core di individuare controller, visualizzare componenti, helper tag, Razor pagine, origini di compilazione razor e altro ancora. AssemblyPart è una parte dell'applicazione. AssemblyPart incapsula un riferimento all'assembly ed espone tipi e riferimenti alla compilazione.

I provider di funzionalità lavorano con le parti dell'applicazione per popolare le funzionalità di un'app ASP.NET Core. Il caso d'uso principale per le parti dell'applicazione consiste nel configurare un'app per individuare (o evitare il caricamento) ASP.NET funzionalità di base da un assembly. Ad esempio, è possibile condividere funzionalità comuni tra più app. Usando le parti dell'applicazione, è possibile condividere un assembly (DLL) contenente controller, visualizzazioni, Razor pagine, origini di compilazione razor, helper tag e altro ancora con più app. La condivisione di un assembly è preferibile duplicare il codice in più progetti.

ASP.NET le funzionalità di caricamento delle app di base da ApplicationPart. La AssemblyPart classe rappresenta una parte dell'applicazione supportata da un assembly.

Caricare le funzionalità di base di ASP.NET

Usare le Microsoft.AspNetCore.Mvc.ApplicationParts classi e AssemblyPart per individuare e caricare ASP.NET funzionalità di base (controller, visualizzare componenti e così via). ApplicationPartManager Tiene traccia delle parti dell'applicazione e dei provider di funzionalità disponibili. ApplicationPartManager è configurato in 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)); });
}

Il codice seguente offre un approccio alternativo alla configurazione ApplicationPartManager tramite 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));
}

I due esempi di codice precedenti caricano da SharedController un assembly. non SharedController è nel progetto dell'app. Vedere il download dell'esempio di soluzione WebAppParts.

Includi visualizzazioni

Usare una libreria di Razor classi per includere le viste nell'assembly.

Impedire il caricamento delle risorse

Le parti dell'applicazione possono essere usate per evitare il caricamento di risorse in un determinato assembly o posizione. Aggiungere o rimuovere membri della Microsoft.AspNetCore.Mvc.ApplicationParts raccolta per nascondere o rendere disponibili le risorse. L'ordine delle voci nella raccolta ApplicationParts non è importante. Configurare prima ApplicationPartManager di usarlo per configurare i servizi nel contenitore. Ad esempio, configurare prima ApplicationPartManager di richiamare AddControllersAsServices. Chiamare Remove sulla ApplicationParts raccolta per rimuovere una risorsa.

Include ApplicationPartManager parti per:

  • Assembly e assembly dipendenti dell'app.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Provider di funzionalità

I provider di funzionalità dell'applicazione esaminano le parti dell'applicazione e forniscono funzionalità per tali parti. Sono disponibili provider di funzionalità predefiniti per le funzionalità di base di ASP.NET seguenti:

I provider di funzionalità ereditano da IApplicationFeatureProvider<TFeature>, dove T è il tipo della funzionalità. I provider di funzionalità possono essere implementati per uno dei tipi di funzionalità elencati in precedenza. L'ordine dei provider di funzionalità in ApplicationPartManager.FeatureProviders può influire sul comportamento del runtime. I provider aggiunti successivamente possono reagire alle azioni eseguite dai provider aggiunti in precedenza.

Visualizzare funzionalità disponibili

Le funzionalità disponibili per un'app possono essere enumerate richiedendo un oggetto ApplicationPartManager tramite l'inserimento delle dipendenze:

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

L'esempio di download usa il codice precedente per visualizzare le funzionalità dell'app:

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

Individuazione nelle parti dell'applicazione

Gli errori HTTP 404 non sono insoliti quando si sviluppano con parti dell'applicazione. Questi errori sono in genere causati dalla mancanza di un requisito essenziale per il modo in cui vengono individuate le parti delle applicazioni. Se l'app restituisce un errore HTTP 404, verificare che siano stati soddisfatti i requisiti seguenti:

  • L'impostazione applicationName deve essere impostata sull'assembly radice usato per l'individuazione. L'assembly radice usato per l'individuazione è in genere l'assembly del punto di ingresso.
  • L'assembly radice deve avere un riferimento alle parti usate per l'individuazione. Il riferimento può essere diretto o transitivo.
  • L'assembly radice deve fare riferimento all'SDK Web. Il framework dispone di logica che contrassegna gli attributi nell'assembly radice usati per l'individuazione.

Di Rick Anderson

Visualizzare o scaricare il codice di esempio (procedura per il download)

Una parte dell'applicazione è un'astrazione sulle risorse di un'app. Le parti dell'applicazione consentono ASP.NET Core di individuare controller, visualizzare componenti, helper tag, Razor pagine, origini di compilazione razor e altro ancora. AssemblyPart è una parte dell'applicazione. AssemblyPart incapsula un riferimento all'assembly ed espone tipi e riferimenti alla compilazione.

I provider di funzionalità lavorano con le parti dell'applicazione per popolare le funzionalità di un'app ASP.NET Core. Il caso d'uso principale per le parti dell'applicazione consiste nel configurare un'app per individuare (o evitare il caricamento) ASP.NET funzionalità di base da un assembly. Ad esempio, è possibile condividere funzionalità comuni tra più app. Usando le parti dell'applicazione, è possibile condividere un assembly (DLL) contenente controller, visualizzazioni, Razor pagine, origini di compilazione razor, helper tag e altro ancora con più app. La condivisione di un assembly è preferibile duplicare il codice in più progetti.

ASP.NET le funzionalità di caricamento delle app di base da ApplicationPart. La AssemblyPart classe rappresenta una parte dell'applicazione supportata da un assembly.

Caricare le funzionalità di base di ASP.NET

Usare le ApplicationPart classi e AssemblyPart per individuare e caricare ASP.NET funzionalità di base (controller, visualizzare componenti e così via). ApplicationPartManager Tiene traccia delle parti dell'applicazione e dei provider di funzionalità disponibili. ApplicationPartManager è configurato in 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);
}

Il codice seguente offre un approccio alternativo alla configurazione ApplicationPartManager tramite 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);
}

I due esempi di codice precedenti caricano da SharedController un assembly. non SharedController è nel progetto dell'applicazione. Vedere il download dell'esempio di soluzione WebAppParts.

Includi visualizzazioni

Usare una libreria di Razor classi per includere le viste nell'assembly.

Impedire il caricamento delle risorse

Le parti dell'applicazione possono essere usate per evitare il caricamento di risorse in un determinato assembly o posizione. Aggiungere o rimuovere membri della Microsoft.AspNetCore.Mvc.ApplicationParts raccolta per nascondere o rendere disponibili le risorse. L'ordine delle voci nella raccolta ApplicationParts non è importante. Configurare prima ApplicationPartManager di usarlo per configurare i servizi nel contenitore. Ad esempio, configurare prima ApplicationPartManager di richiamare AddControllersAsServices. Chiamare Remove sulla ApplicationParts raccolta per rimuovere una risorsa.

Il codice seguente usa Microsoft.AspNetCore.Mvc.ApplicationParts per rimuovere MyDependentLibrary dall'app:

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

Include ApplicationPartManager parti per:

  • Assembly e assembly dipendenti dell'app.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Provider di funzionalità dell'applicazione

I provider di funzionalità dell'applicazione esaminano le parti dell'applicazione e forniscono funzionalità per tali parti. Sono disponibili provider di funzionalità predefiniti per le funzionalità di base di ASP.NET seguenti:

I provider di funzionalità ereditano da IApplicationFeatureProvider<TFeature>, dove T è il tipo della funzionalità. I provider di funzionalità possono essere implementati per uno dei tipi di funzionalità elencati in precedenza. L'ordine dei provider di funzionalità in ApplicationPartManager.FeatureProviders può influire sul comportamento del runtime. I provider aggiunti successivamente possono reagire alle azioni eseguite dai provider aggiunti in precedenza.

Visualizzare funzionalità disponibili

Le funzionalità disponibili per un'app possono essere enumerate richiedendo un oggetto ApplicationPartManager tramite l'inserimento delle dipendenze:

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

L'esempio di download usa il codice precedente per visualizzare le funzionalità dell'app:

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

Individuazione nelle parti dell'applicazione

Gli errori HTTP 404 non sono insoliti quando si sviluppano con parti dell'applicazione. Questi errori sono in genere causati dalla mancanza di un requisito essenziale per il modo in cui vengono individuate le parti delle applicazioni. Se l'app restituisce un errore HTTP 404, verificare che siano stati soddisfatti i requisiti seguenti:

  • L'impostazione applicationName deve essere impostata sull'assembly radice usato per l'individuazione. L'assembly radice usato per l'individuazione è in genere l'assembly del punto di ingresso.
  • L'assembly radice deve avere un riferimento alle parti usate per l'individuazione. Il riferimento può essere diretto o transitivo.
  • L'assembly radice deve fare riferimento all'SDK Web.
    • Il framework ASP.NET Core ha una logica di compilazione personalizzata che contrassegna gli attributi nell'assembly radice usato per l'individuazione.