IServiceCollection
인터페이스에 사용되는 건물 의존성 주입 용기. 완전히 구축 된 후에는 IServiceProvider
서비스를 해결하는 데 사용할 수 있는 인스턴스 로 구성됩니다 . IServiceProvider
어떤 클래스 에나 주입 할 수 있습니다 . IApplicationBuilder
및HttpContext
클래스는 통해뿐만 아니라 서비스 제공 업체에 제공 할 수 있습니다 ApplicationServices
또는 RequestServices
각각 특성.
IServiceProvider
정의 GetService(Type type)
서비스를 해결 방법을 .
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
다음과 같은 몇 가지 편리한 확장 방법이 있습니다. serviceProvider.GetService<IFooService>()
( using
for a 추가)Microsoft.Extensions.DependencyInjection
.
시작 클래스 내에서 서비스 해결
의존성 주입
런타임의 호스팅 서비스 제공 업체의 생성자에 특정 서비스를 삽입 할 수 Startup
와 같은 클래스 IConfiguration
,
IWebHostEnvironment
( IHostingEnvironment
3.0 이전 버전), ILoggerFactory
그리고 IServiceProvider
. 후자는 호스팅 계층에 의해 구축 된 인스턴스 이며 응용 프로그램을 시작하는 데 필요한 서비스 만 포함합니다 .
이 ConfigureServices()
방법은 서비스 주입을 허용하지 않으며 IServiceCollection
인수 만 허용합니다 . ConfigureServices()
응용 프로그램에 필요한 서비스를 등록하는 위치 이기 때문에 이치에 맞습니다 . 그러나 스타트 업의 생성자에 삽입 된 서비스를 여기에서 사용할 수 있습니다 (예 :
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// Use Configuration here
}
등록 된 모든 서비스 ConfigureServices()
는 Configure()
메소드에 주입 될 수 있습니다 . 이후에 임의의 수의 서비스를 추가 할 수 있습니다.IApplicationBuilder
매개 변수 다음에 .
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFooService>();
}
public void Configure(IApplicationBuilder app, IFooService fooService)
{
fooService.Bar();
}
종속성 수동 해결
수동 해결 서비스에 필요한 경우, 바람직하게 사용해야 ApplicationServices
에서 제공을 IApplicationBuilder
에 Configure()
방법 :
public void Configure(IApplicationBuilder app)
{
var serviceProvider = app.ApplicationServices;
var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}
클래스 IServiceProvider
의 생성자에서 in 을 전달하고 직접 사용할 수 Startup
있지만 위와 같이 제한된 서비스 하위 집합이 포함 되므로 유틸리티가 제한적입니다.
public Startup(IServiceProvider serviceProvider)
{
var hostingEnv = serviceProvider.GetService<IWebHostEnvironment>();
}
ConfigureServices()
분석법 에서 서비스를 해결해야하는 경우 다른 접근 방식이 필요합니다. 해당 시점까지 등록 된 서비스를 포함 IServiceProvider
하는 IServiceCollection
인스턴스 에서 중간체 를 빌드 할 수 있습니다 .
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFooService, FooService>();
// Build the intermediate service provider
var sp = services.BuildServiceProvider();
// This will succeed.
var fooService = sp.GetService<IFooService>();
// This will fail (return null), as IBarService hasn't been registered yet.
var barService = sp.GetService<IBarService>();
}
참고 :
일반적으로 ConfigureServices()
메소드 내에서 서비스를 분석하지 마십시오. 실제로 애플리케이션 서비스를 구성 하는 위치 입니다. 때로는 IOptions<MyOptions>
인스턴스에 액세스해야 합니다. IConfiguration
인스턴스 의 값을 인스턴스 에 바인딩하여이를 수행 할 수 있습니다 MyOptions
(기본적으로 옵션 프레임 워크의 기능 임).
public void ConfigureServices(IServiceCollection services)
{
var myOptions = new MyOptions();
Configuration.GetSection("SomeSection").Bind(myOptions);
}
서비스 수동 해결 (일명 서비스 로케이터)은 일반적으로 안티 패턴으로 간주됩니다 . 프레임 워크 및 / 또는 인프라 계층에 대한 사용 사례가 있지만 가능한 많이 사용하지 않아야합니다.