Berbagi pengontrol, tampilan, Halaman, Razor dan lainnya dengan Bagian Aplikasi

Oleh Rick Anderson

Melihat atau mengunduh kode sampel (cara mengunduh)

Bagian Aplikasi adalah abstraksi atas sumber daya aplikasi. Komponen Aplikasi memungkinkan ASP.NET Core untuk menemukan pengontrol, melihat komponen, pembantu tag, Razor Halaman, sumber kompilasi pisau cukur, dan banyak lagi. AssemblyPart adalah bagian Aplikasi. AssemblyPart merangkum referensi perakitan dan mengekspos jenis dan referensi kompilasi.

Penyedia fitur bekerja dengan bagian aplikasi untuk mengisi fitur aplikasi ASP.NET Core. Kasus penggunaan utama untuk bagian aplikasi adalah mengonfigurasi aplikasi untuk menemukan (atau menghindari pemuatan) ASP.NET fitur Core dari rakitan. Misalnya, Anda mungkin ingin berbagi fungsionalitas umum antara beberapa aplikasi. Dengan menggunakan Bagian Aplikasi, Anda dapat berbagi assembly (DLL) yang berisi pengontrol, tampilan, Razor Halaman, sumber kompilasi pisau cukur, Pembantu Tag, dan banyak lagi dengan beberapa aplikasi. Berbagi rakitan lebih disukai untuk menduplikasi kode dalam beberapa proyek.

ASP.NET Fitur beban aplikasi Core dari ApplicationPart. Kelas AssemblyPart mewakili bagian aplikasi yang didukung oleh rakitan.

Memuat fitur ASP.NET Core

Microsoft.AspNetCore.Mvc.ApplicationParts Gunakan kelas dan AssemblyPart untuk menemukan dan memuat fitur ASP.NET Core (pengontrol, komponen tampilan, dll.). Melacak ApplicationPartManager bagian aplikasi dan penyedia fitur yang tersedia. ApplicationPartManager dikonfigurasi dalam 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)); });
}

Kode berikut menyediakan pendekatan alternatif untuk mengonfigurasi ApplicationPartManager menggunakan 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));
}

Dua sampel kode sebelumnya memuat SharedController dari rakitan. SharedController tidak ada dalam proyek aplikasi. Lihat unduhan sampel solusi WebAppParts.

Sertakan tampilan

Razor Gunakan pustaka kelas untuk menyertakan tampilan dalam rakitan.

Mencegah pemuatan sumber daya

Bagian aplikasi dapat digunakan untuk menghindari pemuatan sumber daya di rakitan atau lokasi tertentu. Tambahkan atau hapus anggota Microsoft.AspNetCore.Mvc.ApplicationParts koleksi untuk menyembunyikan atau menyediakan sumber daya. Urutan entri dalam ApplicationParts koleksi tidak penting. Konfigurasikan ApplicationPartManager sebelum menggunakannya untuk mengonfigurasi layanan dalam kontainer. Misalnya, konfigurasikan ApplicationPartManager sebelum memanggil AddControllersAsServices. Panggil Remove pada ApplicationParts koleksi untuk menghapus sumber daya.

Bagian-bagian ApplicationPartManager yang termasuk untuk:

  • Rakitan dan rakitan dependen aplikasi.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Penyedia fitur

Penyedia fitur aplikasi memeriksa bagian aplikasi dan menyediakan fitur untuk bagian-bagian tersebut. Ada penyedia fitur bawaan untuk fitur ASP.NET Core berikut:

Penyedia fitur mewarisi dari IApplicationFeatureProvider<TFeature>, di mana T adalah jenis fitur. Penyedia fitur dapat diimplementasikan untuk salah satu jenis fitur yang tercantum sebelumnya. Urutan penyedia fitur dalam ApplicationPartManager.FeatureProviders dapat memengaruhi perilaku run time. Penyedia yang ditambahkan kemudian dapat bereaksi terhadap tindakan yang diambil oleh penyedia yang ditambahkan sebelumnya.

Menampilkan fitur yang tersedia

Fitur yang tersedia untuk aplikasi dapat dijumlahkan dengan meminta ApplicationPartManager melalui injeksi dependensi:

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

Sampel unduhan menggunakan kode sebelumnya untuk menampilkan fitur aplikasi:

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

Penemuan di bagian aplikasi

Kesalahan HTTP 404 tidak jarang terjadi saat mengembangkan dengan bagian aplikasi. Kesalahan ini biasanya disebabkan oleh hilangnya persyaratan penting tentang bagaimana bagian aplikasi ditemukan. Jika aplikasi Anda mengembalikan kesalahan HTTP 404, verifikasi persyaratan berikut telah terpenuhi:

  • Pengaturan applicationName perlu diatur ke rakitan akar yang digunakan untuk penemuan. Rakitan akar yang digunakan untuk penemuan biasanya merupakan perakitan titik masuk.
  • Rakitan akar harus memiliki referensi ke bagian yang digunakan untuk penemuan. Referensinya bisa langsung atau transitif.
  • Rakitan akar perlu mereferensikan Web SDK. Kerangka kerja memiliki logika yang memberi stempel atribut ke dalam rakitan akar yang digunakan untuk penemuan.

Oleh Rick Anderson

Melihat atau mengunduh kode sampel (cara mengunduh)

Bagian Aplikasi adalah abstraksi atas sumber daya aplikasi. Komponen Aplikasi memungkinkan ASP.NET Core untuk menemukan pengontrol, melihat komponen, pembantu tag, Razor Halaman, sumber kompilasi pisau cukur, dan banyak lagi. AssemblyPart adalah bagian Aplikasi. AssemblyPart merangkum referensi perakitan dan mengekspos jenis dan referensi kompilasi.

Penyedia fitur bekerja dengan bagian aplikasi untuk mengisi fitur aplikasi ASP.NET Core. Kasus penggunaan utama untuk bagian aplikasi adalah mengonfigurasi aplikasi untuk menemukan (atau menghindari pemuatan) ASP.NET fitur Core dari rakitan. Misalnya, Anda mungkin ingin berbagi fungsionalitas umum antara beberapa aplikasi. Dengan menggunakan Bagian Aplikasi, Anda dapat berbagi assembly (DLL) yang berisi pengontrol, tampilan, Razor Halaman, sumber kompilasi pisau cukur, Pembantu Tag, dan banyak lagi dengan beberapa aplikasi. Berbagi rakitan lebih disukai untuk menduplikasi kode dalam beberapa proyek.

ASP.NET Fitur beban aplikasi Core dari ApplicationPart. Kelas AssemblyPart mewakili bagian aplikasi yang didukung oleh rakitan.

Memuat fitur ASP.NET Core

ApplicationPart Gunakan kelas dan AssemblyPart untuk menemukan dan memuat fitur ASP.NET Core (pengontrol, komponen tampilan, dll.). Melacak ApplicationPartManager bagian aplikasi dan penyedia fitur yang tersedia. ApplicationPartManager dikonfigurasi dalam 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);
}

Kode berikut menyediakan pendekatan alternatif untuk mengonfigurasi ApplicationPartManager menggunakan 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);
}

Dua sampel kode sebelumnya memuat SharedController dari rakitan. SharedController tidak ada dalam proyek aplikasi. Lihat unduhan sampel solusi WebAppParts.

Sertakan tampilan

Razor Gunakan pustaka kelas untuk menyertakan tampilan dalam rakitan.

Mencegah pemuatan sumber daya

Bagian aplikasi dapat digunakan untuk menghindari pemuatan sumber daya di rakitan atau lokasi tertentu. Tambahkan atau hapus anggota Microsoft.AspNetCore.Mvc.ApplicationParts koleksi untuk menyembunyikan atau menyediakan sumber daya. Urutan entri dalam ApplicationParts koleksi tidak penting. Konfigurasikan ApplicationPartManager sebelum menggunakannya untuk mengonfigurasi layanan dalam kontainer. Misalnya, konfigurasikan ApplicationPartManager sebelum memanggil AddControllersAsServices. Panggil Remove pada ApplicationParts koleksi untuk menghapus sumber daya.

Kode berikut menggunakan Microsoft.AspNetCore.Mvc.ApplicationParts untuk menghapus MyDependentLibrary dari aplikasi:

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

Bagian-bagian ApplicationPartManager yang termasuk untuk:

  • Rakitan dan rakitan dependen aplikasi.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

Penyedia fitur aplikasi

Penyedia fitur aplikasi memeriksa bagian aplikasi dan menyediakan fitur untuk bagian-bagian tersebut. Ada penyedia fitur bawaan untuk fitur ASP.NET Core berikut:

Penyedia fitur mewarisi dari IApplicationFeatureProvider<TFeature>, di mana T adalah jenis fitur. Penyedia fitur dapat diimplementasikan untuk salah satu jenis fitur yang tercantum sebelumnya. Urutan penyedia fitur dalam ApplicationPartManager.FeatureProviders dapat memengaruhi perilaku run time. Penyedia yang ditambahkan kemudian dapat bereaksi terhadap tindakan yang diambil oleh penyedia yang ditambahkan sebelumnya.

Menampilkan fitur yang tersedia

Fitur yang tersedia untuk aplikasi dapat dijumlahkan dengan meminta ApplicationPartManager melalui injeksi dependensi:

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

Sampel unduhan menggunakan kode sebelumnya untuk menampilkan fitur aplikasi:

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

Penemuan di bagian aplikasi

Kesalahan HTTP 404 tidak jarang terjadi saat mengembangkan dengan bagian aplikasi. Kesalahan ini biasanya disebabkan oleh hilangnya persyaratan penting tentang bagaimana bagian aplikasi ditemukan. Jika aplikasi Anda mengembalikan kesalahan HTTP 404, verifikasi persyaratan berikut telah terpenuhi:

  • Pengaturan applicationName perlu diatur ke rakitan akar yang digunakan untuk penemuan. Rakitan akar yang digunakan untuk penemuan biasanya merupakan perakitan titik masuk.
  • Rakitan akar harus memiliki referensi ke bagian yang digunakan untuk penemuan. Referensinya bisa langsung atau transitif.
  • Rakitan akar perlu mereferensikan Web SDK.
    • Kerangka kerja ASP.NET Core memiliki logika build kustom yang memberi stempel atribut ke dalam rakitan akar yang digunakan untuk penemuan.