Dela via


Dela kontrollanter, vyer, Razor sidor med mera med programdelar

Av Rick Anderson

Visa eller ladda ned exempelkod (hur du laddar ned)

En programdel är en abstraktion över resurserna i en app. Med programdelar kan ASP.NET Core identifiera styrenheter, visa komponenter, tag helpers, Razor Pages, rakbladskompileringskällor med mera. AssemblyPart är en programdel. AssemblyPart kapslar in en sammansättningsreferens och exponerar typer och kompileringsreferenser.

Funktionsprovidrar arbetar med applikationsdelar för att populera funktionerna i en ASP.NET Core-app. Det huvudsakliga användningsfallet för programdelar är att konfigurera en app för att identifiera (eller undvika inläsning) ASP.NET Core-funktioner från en sammansättning. Du kanske till exempel vill dela gemensamma funktioner mellan flera appar. Med hjälp av programdelar (Application Parts) kan du dela en DLL-fil som innehåller styrenheter, vyer, Razor-sidor, källkoder för Razor-kompilering, Tag Helpers och mer med flera appar. Att dela en sammansättning är att föredra för att duplicera kod i flera projekt.

ASP.NET Core-appar läser in funktioner från ApplicationPart. Klassen AssemblyPart representerar en programdel som backas upp av en sammansättning.

Läs in ASP.NET Core-funktioner

Använd klasserna Microsoft.AspNetCore.Mvc.ApplicationParts och AssemblyPart för att identifiera och läsa in ASP.NET Core-funktioner (styrenheter, visa komponenter osv.). ApplicationPartManager spårar programdelarna och funktionsprovidrar som är tillgängliga. ApplicationPartManager har konfigurerats i 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)); });
}

Följande kod ger en alternativ metod för att konfigurera ApplicationPartManager med hjälp av 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));
}

De föregående två kodexemplen läser in SharedController från en sammansättning. SharedController finns inte i appens projekt. Se exempelnedladdningen för WebAppParts-lösningen.

Inkludera vyer

Använd ett Razor klassbibliotek för att inkludera vyer i sammansättningen.

Förhindra inläsning av resurser

Programdelar kan användas för att undvika inläsning av resurser på en viss sammansättning eller plats. Lägg till eller ta bort medlemmar i Microsoft.AspNetCore.Mvc.ApplicationParts-samlingen för att dölja eller göra tillgängliga resurser. Ordningen på posterna i ApplicationParts-samlingen är inte viktig. Konfigurera ApplicationPartManager innan du använder den för att konfigurera tjänster i containern. Konfigurera till exempel ApplicationPartManager innan du anropar AddControllersAsServices. Anropa Remove i samlingen ApplicationParts för att ta bort en resurs.

ApplicationPartManager innehåller delar för:

  • Appens sammansättning och beroende sammansättningar.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Funktionsleverantörer

Programfunktionsleverantörer undersöker programdelar och tillhandahåller funktioner för dessa delar. Det finns inbyggda funktionsprovidrar för följande ASP.NET Core-funktioner:

Funktionsprovidrar ärver från IApplicationFeatureProvider<TFeature>, där T är funktionens typ. Funktionsprovidrar kan implementeras för någon av de tidigare listade funktionstyperna. Ordningen på funktionsprovidrar i ApplicationPartManager.FeatureProviders kan påverka körningstidsbeteendet. Senare tillagda leverantörer kan reagera på åtgärder som vidtagits av tidigare tillagda leverantörer.

Visa tillgängliga funktioner

Funktionerna som är tillgängliga för en app kan listas genom att begära en ApplicationPartManager via beroendeinjektion:

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

nedladdningsexempel använder föregående kodavsnitt för att visa upp appens funktioner:

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

Upptäckt i applikationsdelar

HTTP 404-fel är inte ovanliga när du utvecklar med programdelar. Dessa fel orsakas vanligtvis av att ett viktigt krav saknas för hur programdelar identifieras. Om din app returnerar ett HTTP 404-fel kontrollerar du att följande krav har uppfyllts:

  • Inställningen applicationName måste anges till den rotsammansättning som används för upptäckt. Rotsammansättningen som används för identifiering är normalt startpunktssammansättningen.
  • Rotsammansättningen måste ha en referens till de delar som används för identifiering. Referensen kan vara direkt eller transitiv.
  • Rotsammansättningen måste referera till Web SDK. Ramverket har logik som stämplar attribut i rotsammansättningen som används för identifiering.

Av Rick Anderson

Visa eller ladda ned exempelkod (hur du laddar ned)

En programdel är en abstraktion över resurserna i en app. Med applikationsdelar kan ASP.NET Core identifiera kontroller, vykomponenter, tag helpers, Razor Pages, Razor-kompilationskällor med mera. AssemblyPart är en programdel. AssemblyPart kapslar in en sammansättningsreferens och exponerar typer och kompileringsreferenser.

Funktionsleverantörer arbetar med programkomponenter för att integrera funktioner i en ASP.NET Core-applikation. Det huvudsakliga användningsfallet för programdelar är att konfigurera en app för att identifiera (eller undvika inläsning) ASP.NET Core-funktioner från en sammansättning. Du kanske till exempel vill dela gemensamma funktioner mellan flera appar. Med hjälp av programdelar kan du dela en assembly (DLL) som innehåller styrenheter, vyer, Razor-sidor, Razor-kompilering, Tag Helpers och mycket mer med flera appar. Att dela en sammansättning är att föredra för att duplicera kod i flera projekt.

ASP.NET Core-appar läser in funktioner från ApplicationPart. Klassen AssemblyPart representerar en programdel som backas upp av en sammansättning.

Läs in ASP.NET Core-funktioner

Använd klasserna ApplicationPart och AssemblyPart för att identifiera och läsa in ASP.NET Core-funktioner (styrenheter, visa komponenter osv.). ApplicationPartManager spårar programdelarna och funktionsprovidrar som är tillgängliga. ApplicationPartManager har konfigurerats i 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);
}

Följande kod ger en alternativ metod för att konfigurera ApplicationPartManager med hjälp av 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);
}

De föregående två kodexemplen läser in SharedController från en sammansättning. SharedController finns inte i programmets projekt. Se WebAppParts-lösningens exempel för nedladdning.

Inkludera vyer

Använd ett Razor klassbibliotek för att inkludera vyer i sammansättningen.

Förhindra inläsning av resurser

Programdelar kan användas för att undvika inläsning av resurser på en viss sammansättning eller plats. Lägg till eller ta bort medlemmar i Microsoft.AspNetCore.Mvc.ApplicationParts-samlingen för att dölja eller göra tillgängliga resurser. Ordningen på posterna i ApplicationParts-samlingen är inte viktig. Konfigurera ApplicationPartManager innan du använder den för att konfigurera tjänster i containern. Konfigurera till exempel ApplicationPartManager innan du anropar AddControllersAsServices. Anropa Remove i samlingen ApplicationParts för att ta bort en resurs.

Följande kod använder Microsoft.AspNetCore.Mvc.ApplicationParts för att ta bort MyDependentLibrary från appen:

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 innehåller delar för:

  • Appens sammansättning och beroende sammansättningar.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Programfunktionsprovidrar

Programfunktionsleverantörer undersöker programdelar och tillhandahåller funktioner för dessa delar. Det finns inbyggda funktionsprovidrar för följande ASP.NET Core-funktioner:

Funktionsprovidrar ärver från IApplicationFeatureProvider<TFeature>, där T är funktionens typ. Funktionsprovidrar kan implementeras för någon av de tidigare listade funktionstyperna. Ordningen på funktionsprovidrar i ApplicationPartManager.FeatureProviders kan påverka hur programmet beter sig vid körning. Senare tillagda leverantörer kan reagera på åtgärder som vidtagits av tidigare tillagda leverantörer.

Visa tillgängliga funktioner

Funktionerna som är tillgängliga för en app kan räknas upp genom att begära en ApplicationPartManager genom beroendeinjektion:

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

Nedladdningsexempel använder den föregående koden för att visa appens funktioner:

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

Upptäckt i applikationsdelar

HTTP 404-fel är inte ovanliga när du utvecklar med programdelar. Dessa fel orsakas vanligtvis av att ett viktigt krav saknas för hur programdelar identifieras. Om din app returnerar ett HTTP 404-fel kontrollerar du att följande krav har uppfyllts:

  • Inställningen applicationName måste anges till den rotsammansättning som används för upptäckt. Rotsammansättningen som används för identifiering är normalt startpunktssammansättningen.
  • Rotsammansättningen måste ha en referens till de delar som används för identifiering. Referensen kan vara direkt eller transitiv.
  • Rotsammansättningen måste referera till Web SDK.
    • ASP.NET Core-ramverket har anpassad bygglogik som stämplar attribut i rotsammansättningen som används för identifiering.