다음을 통해 공유


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이(가) 잘못 구성되었거나 존재하지 않는 경우 CreateInstance이(가) 잘못 작동하거나 모호하게 작동할 수 있습니다.

호환성이 손상되는 변경의 형식

이 변경 사항은 동작 변경입니다.

변경 이유

이 변경은 생성자 오버로드 정의의 순서에 따라 동작이 변경된 버그를 수정하기 위해 이루어졌습니다.

.NET 8로 업그레이드한 후 앱이 다르게 동작하거나 예외를 throw 하기 시작한다면 영향을 받는 인스턴스 형식에 대한 생성자 정의를 주의 깊게 검토하세요. 새 동작 섹션을 참조하세요.

영향을 받는 API

참고 항목