애플리케이션 파트를 사용하여 컨트롤러, 보기, Razor Pages 등을 공유

작성자: Rick Anderson

샘플 코드 보기 및 다운로드(다운로드 방법)

애플리케이션 파트는 앱의 리소스에 대한 추상화입니다. 애플리케이션 파트를 사용하면 ASP.NET Core에서 컨트롤러, 보기 구성 요소, 태그 도우미, Razor Pages, Razor 컴파일 소스 등을 검색할 수 있습니다. AssemblyPart는 애플리케이션 파트입니다. AssemblyPart는 어셈블리 참조를 캡슐화하고 형식 및 컴파일 참조를 공개합니다.

기능 공급자는 애플리케이션 파트를 사용하여 ASP.NET Core 앱의 기능을 구성합니다. 애플리케이션 파트에 대한 주요 사용 사례는 어셈블리에서 ASP.NET Core 기능을 검색(또는 로드를 방지)하도록 앱을 구성하는 것입니다. 예를 들어 여러 앱 간에 공통적인 기능을 공유하는 것이 좋습니다. 애플리케이션 파트를 사용하여 여러 앱에서 컨트롤러, 보기, Razor Pages, Razor 컴파일 소스, 태그 도우미 등을 포함하는 어셈블리(DLL)를 공유할 수 있습니다. 여러 프로젝트에서 코드를 복제하려면 어셈블리를 공유하는 것이 좋습니다.

ASP.NET Core 앱은 ApplicationPart로부터 기능을 로드합니다. AssemblyPart 클래스는 어셈블리에서 지원하는 애플리케이션 파트를 나타냅니다.

ASP.NET Core 기능 로드

Microsoft.AspNetCore.Mvc.ApplicationPartsAssemblyPart 클래스를 사용하여 ASP.NET Core 기능(컨트롤러, 보기 구성 요소 등)을 검색 및 로드합니다. ApplicationPartManager는 사용할 수 있는 애플리케이션 파트 및 기능 공급자를 추적합니다. ApplicationPartManagerStartup.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)); });
}

다음 코드는 AssemblyPart를 사용하여 ApplicationPartManager 구성에 대한 대체 방법을 제공합니다.

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

위의 두 코드 샘플은 어셈블리로부터 SharedController를 로드합니다. SharedController는 앱의 프로젝트에 없습니다. WebAppParts 솔루션 샘플 다운로드를 참조하세요.

보기 포함

Razor 클래스 라이브러리를 사용하여 어셈블리에 보기를 포함합니다.

리소스 로드 방지

애플리케이션 파트를 사용하여 리소스가 특정 어셈블리나 위치에서 로드되는 것을 방지할 수 있습니다. Microsoft.AspNetCore.Mvc.ApplicationParts 컬렉션의 멤버를 추가 또는 제거하여 리소스를 숨기거나 사용 가능하게 만듭니다. ApplicationParts 컬렉션의 항목 순서는 중요하지 않습니다. 컨테이너에서 서비스를 구성하는 데 사용하기 전에 ApplicationPartManager를 구성합니다. 예를 들어 AddControllersAsServices를 호출하기 전에 ApplicationPartManager를 구성합니다. ApplicationParts 컬렉션에서 Remove를 호출하여 리소스를 제거합니다.

ApplicationPartManager에는 다음을 위한 파트가 포함됩니다.

  • 앱의 어셈블리 및 종속 어셈블리.
  • Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyPart
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

기능 공급자

애플리케이션 기능 공급자는 애플리케이션 파트를 검사하고 해당 파트에 대한 기능을 제공합니다. 다음 ASP.NET Core 기능에는 기본으로 제공되는 기능 공급자가 있습니다.

기능 공급자는 IApplicationFeatureProvider<TFeature>에서 상속되며, 여기서 T는 기능의 형식입니다. 기능 공급자는 이전에 나열된 모든 기능 형식에 대해 구현할 수 있습니다. ApplicationPartManager.FeatureProviders의 기능 공급자 순서는 런타임 동작에 영향을 줄 수 있습니다. 나중에 추가된 공급자는 이전에 추가된 공급자가 수행한 작업에 반응할 수 있습니다.

사용 가능 기능 표시

앱에 사용 가능한 기능은 종속성 주입을 통해 ApplicationPartManager를 요청하여 열거할 수 있습니다.

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

샘플 다운로드는 위의 코드를 사용하여 앱 기능을 표시합니다.

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

애플리케이션 파트에서 검색

HTTP 404 오류는 애플리케이션 파트를 사용하여 개발할 때 일반적이지는 않습니다. 이러한 오류는 일반적으로 애플리케이션 파트를 검색하는 방법에 대한 필수 요구 사항이 없기 때문에 발생합니다. 앱에서 HTTP 404 오류를 반환하는 경우 다음 요구 사항이 충족되었는지 확인합니다.

  • applicationName 설정은 검색에 사용되는 루트 어셈블리로 설정해야 합니다. 검색에 사용되는 루트 어셈블리는 일반적으로 진입점 어셈블리입니다.
  • 루트 어셈블리에는 검색에 사용되는 파트에 대한 참조가 있어야 합니다. 참조는 직접적 또는 전이적일 수 있습니다.
  • 루트 어셈블리는 웹 SDK를 참조해야 합니다. 프레임워크에는 검색에 사용되는 루트 어셈블리에 특성을 스탬핑하는 논리가 있습니다.

작성자: Rick Anderson

샘플 코드 보기 및 다운로드(다운로드 방법)

애플리케이션 파트는 앱의 리소스에 대한 추상화입니다. 애플리케이션 파트를 사용하면 ASP.NET Core에서 컨트롤러, 보기 구성 요소, 태그 도우미, Razor Pages, Razor 컴파일 소스 등을 검색할 수 있습니다. AssemblyPart는 애플리케이션 파트입니다. AssemblyPart는 어셈블리 참조를 캡슐화하고 형식 및 컴파일 참조를 공개합니다.

기능 공급자는 애플리케이션 파트를 사용하여 ASP.NET Core 앱의 기능을 구성합니다. 애플리케이션 파트에 대한 주요 사용 사례는 어셈블리에서 ASP.NET Core 기능을 검색(또는 로드를 방지)하도록 앱을 구성하는 것입니다. 예를 들어 여러 앱 간에 공통적인 기능을 공유하는 것이 좋습니다. 애플리케이션 파트를 사용하여 여러 앱에서 컨트롤러, 보기, Razor Pages, Razor 컴파일 소스, 태그 도우미 등을 포함하는 어셈블리(DLL)를 공유할 수 있습니다. 여러 프로젝트에서 코드를 복제하려면 어셈블리를 공유하는 것이 좋습니다.

ASP.NET Core 앱은 ApplicationPart로부터 기능을 로드합니다. AssemblyPart 클래스는 어셈블리에서 지원하는 애플리케이션 파트를 나타냅니다.

ASP.NET Core 기능 로드

ApplicationPartAssemblyPart 클래스를 사용하여 ASP.NET Core 기능(컨트롤러, 보기 구성 요소 등)을 검색 및 로드합니다. ApplicationPartManager는 사용할 수 있는 애플리케이션 파트 및 기능 공급자를 추적합니다. ApplicationPartManagerStartup.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);
}

다음 코드는 AssemblyPart를 사용하여 ApplicationPartManager 구성에 대한 대체 방법을 제공합니다.

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

위의 두 코드 샘플은 어셈블리로부터 SharedController를 로드합니다. SharedController는 애플리케이션의 프로젝트에 포함되지 않습니다. WebAppParts 솔루션 샘플 다운로드를 참조하세요.

보기 포함

Razor 클래스 라이브러리를 사용하여 어셈블리에 보기를 포함합니다.

리소스 로드 방지

애플리케이션 파트를 사용하여 리소스가 특정 어셈블리나 위치에서 로드되는 것을 방지할 수 있습니다. Microsoft.AspNetCore.Mvc.ApplicationParts 컬렉션의 멤버를 추가 또는 제거하여 리소스를 숨기거나 사용 가능하게 만듭니다. ApplicationParts 컬렉션의 항목 순서는 중요하지 않습니다. 컨테이너에서 서비스를 구성하는 데 사용하기 전에 ApplicationPartManager를 구성합니다. 예를 들어 AddControllersAsServices를 호출하기 전에 ApplicationPartManager를 구성합니다. ApplicationParts 컬렉션에서 Remove를 호출하여 리소스를 제거합니다.

다음 코드는 앱에서 제거하는 MyDependentLibrary 데 사용합니다Microsoft.AspNetCore.Mvc.ApplicationParts.

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에는 다음을 위한 파트가 포함됩니다.

  • 앱의 어셈블리 및 종속 어셈블리.
  • Microsoft.AspNetCore.Mvc.TagHelpers.
  • Microsoft.AspNetCore.Mvc.Razor.

애플리케이션 기능 공급자

애플리케이션 기능 공급자는 애플리케이션 파트를 검사하고 해당 파트에 대한 기능을 제공합니다. 다음 ASP.NET Core 기능에는 기본으로 제공되는 기능 공급자가 있습니다.

기능 공급자는 IApplicationFeatureProvider<TFeature>에서 상속되며, 여기서 T는 기능의 형식입니다. 기능 공급자는 이전에 나열된 모든 기능 형식에 대해 구현할 수 있습니다. ApplicationPartManager.FeatureProviders의 기능 공급자 순서는 런타임 동작에 영향을 줄 수 있습니다. 나중에 추가된 공급자는 이전에 추가된 공급자가 수행한 작업에 반응할 수 있습니다.

사용 가능 기능 표시

앱에 사용 가능한 기능은 종속성 주입을 통해 ApplicationPartManager를 요청하여 열거할 수 있습니다.

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

샘플 다운로드는 위의 코드를 사용하여 앱 기능을 표시합니다.

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

애플리케이션 파트에서 검색

HTTP 404 오류는 애플리케이션 파트를 사용하여 개발할 때 일반적이지는 않습니다. 이러한 오류는 일반적으로 애플리케이션 파트를 검색하는 방법에 대한 필수 요구 사항이 없기 때문에 발생합니다. 앱에서 HTTP 404 오류를 반환하는 경우 다음 요구 사항이 충족되었는지 확인합니다.

  • applicationName 설정은 검색에 사용되는 루트 어셈블리로 설정해야 합니다. 검색에 사용되는 루트 어셈블리는 일반적으로 진입점 어셈블리입니다.
  • 루트 어셈블리에는 검색에 사용되는 파트에 대한 참조가 있어야 합니다. 참조는 직접적 또는 전이적일 수 있습니다.
  • 루트 어셈블리는 웹 SDK를 참조해야 합니다.
    • ASP.NET Core 프레임워크에는 검색에 사용되는 루트 어셈블리에 특성을 스탬핑하는 사용자 지정 빌드 논리가 있습니다.