>

IPersonProvider의 팩토리를 다음과 같이 등록 할 때 :

services.AddScoped<IPersonProvider, PersonProvider>();
services.AddSingleton<Func<IPersonProvider>>(sp => () => sp.GetService<IPersonProvider>());

오류가 발생했습니다 :

InvalidOperationException: Cannot resolve scoped service 'DependencyApp.Provider.IPersonProvider' from root provider.

Scoped 종속성으로 Singleton 객체를 해결할 수 없다는 것을 알고 있지만 팩토리에는 Scoped 종속성이 없습니다. 실제로 종속성이 없습니다. 다음과 같이 요청하면 객체가 생성됩니다.

public class HomeController : Controller
{
    private readonly Func<IPersonProvider> _factory;
    public HomeController(Func<IPersonProvider> factory)
    {
        _factory = factory;
    }
    [Route("/")]
    public string Calculate()
    {
        var personProvider = _factory();
        //.
        //.
        //.
        return "test";
    }
}

이 오류가 발생하는 이유는 무엇입니까? 문제를 해결하는 방법? 전체 응용 프로그램이 범위가 지정된 객체를 만드는 데 아무런 문제가없는 한 살아남을 수있는 팩토리를 Singleton으로 등록한다고 생각합니다. 결국 만들어진 객체는 실제로 싱글 톤의 종속성이 아닙니다.


  • 답변 # 1

    이 문제가 발생한 이유는 IServiceProvider 의 인스턴스 때문입니다.  사용 중입니다. 서비스를 싱글 톤으로 등록하면 루트 IServiceProvider  팩토리 메소드로 전달됩니다.

    있으면 :

    services.AddSingleton<Func<IPersonProvider>>(sp => () => sp.GetService<IPersonProvider>());
    
    

    그것은 sp 를 의미  루트 서비스 제공 업체 인 단일 수명과 호환되어야합니다.

    내가 무슨 뜻인지 설명하기 위해

    using (var scopedServiceProvider = sp.CreateScope())
    {
        scopedServiceProvider.GetService<IPersonProvider>(); // valid
        sp.GetService<IPersonProvider>(); // not valid
    }
    
    
    그러나, 공장 방법이 일시적인 수명 일 때, sp  전달 된 서비스는 더 이상 루트 서비스 제공 업체를 사용하지 않고 범위 지정된 서비스 인스턴스화 제한이 적용되지 않는 파생 서비스를 사용합니다.

    문제를 반복하기 위해, sp  사용중인 범위 서비스를 작성할 수 없으므로 서비스가 Func 로 리턴되는 것은 중요하지 않습니다. , 대신 제공자가 루트 제공자라는 사실입니다.

  • 답변 # 2

    잘 작동했습니다.

    services.AddSingleton<ITokenManager, TokenManger>();
     services.AddScoped<ITokenProvider, TokenProvider>();
    public class TokenProvider : ITokenProvider
    {
        private readonly ITokenManager _tokenManager;
        public TokenProvider(ITokenManager tokenManager)
        {
            _tokenManager = tokenManager;
        }
    }
    
    

  • 이전 java - WebFlux에서 필터로 발신 요청에 헤더 추가
  • 다음 c# - 생성자 내에서 다른 클래스를 인스턴스화 할 수 있습니까?