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, razor sumber kompilasi, 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, razor sumber kompilasi, Pembantu Tag, dan lainnya 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:
- ControllerFeatureProvider
- TagHelperFeatureProvider
- MetadataReferenceFeatureProvider
- ViewsFeatureProvider
internal class
RazorCompiledItemFeatureProvider
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, razor sumber kompilasi, 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, razor sumber kompilasi, Pembantu Tag, dan lainnya 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.
ASP.NET Core