ActivatorUtilities.CreateInstance가 일관되게 동작
이제 ActivatorUtilities.CreateInstance 동작이 CreateFactory(Type, Type[])과(와) 더 잘 일치합니다. IServiceProviderIsService이(가) DI(종속성 주입) 컨테이너에 없는 경우 CreateInstance이(가) CreateFactory(Type, Type[]) 논리로 대체됩니다. 이 논리에서는 제공된 모든 입력 매개 변수에 하나의 생성자만 일치하도록 허용됩니다.
더 일반적인 경우로, IServiceProviderIsService이(가) 있을 때는 CreateInstance
API는 모든 인수를 사용할 수 있는 가장 긴 생성자 오버로드를 선호합니다. 인수는 API에 입력되거나, 컨테이너에 등록되거나, 생성자 자체의 기본값에서 사용할 수 있습니다.
두 생성자를 보여주는 다음과 같은 클래스 정의를 고려하세요.
public class A
{
A(B b, C c, string st = "default string") { }
A() { }
}
이 클래스 정의의 경우 IServiceProviderIsService
이(가) 있으면 ActivatorUtilities.CreateInstance<A>(serviceProvider, new C())
은(는) B
, C
, string
을(를) 사용하는 첫 번째 생성자를 선택하여 A
을(를) 인스턴스화합니다.
도입된 버전
.NET 8 미리 보기 1
이전 동작
어떤 경우에 ActivatorUtilities.CreateInstance은(는) 예기치 않게 동작했습니다. 전달받은 모든 필수 인스턴스가 선택한 생성자에 있는지 확인했습니다. 하지만 생성자 선택은 버그가 많고 신뢰할 수 없습니다.
새 동작
CreateInstance은(는) IServiceProviderIsService의 동작에 따라 모든 매개 변수와 일치하는 가장 긴 생성자를 찾으려고 합니다.
- 생성자를 찾을 수 없거나 IServiceProviderIsService이(가) 없는 경우 CreateFactory(Type, Type[]) 논리로 대체됩니다.
- 둘 이상의 생성자를 찾으면 InvalidOperationException을(를) throw 합니다.
참고 항목
IServiceProviderIsService이(가) 잘못 구성되었거나 존재하지 않는 경우 CreateInstance
이(가) 잘못 작동하거나 모호하게 작동할 수 있습니다.
호환성이 손상되는 변경의 형식
이 변경 사항은 동작 변경입니다.
변경 이유
이 변경은 생성자 오버로드 정의의 순서에 따라 동작이 변경된 버그를 수정하기 위해 이루어졌습니다.
권장 작업
.NET 8로 업그레이드한 후 앱이 다르게 동작하거나 예외를 throw 하기 시작한다면 영향을 받는 인스턴스 형식에 대한 생성자 정의를 주의 깊게 검토하세요. 새 동작 섹션을 참조하세요.
영향을 받는 API
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[])
- Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[])
참고 항목
.NET