1

FluentValidation을 사용하여 사용자 지정 모델 유효성 검사기 공급자를 설정하려고합니다. 모든 것은 비즈니스 계층 관리자를 validator의 생성자에 삽입하여 비즈니스 로직을 실행하기 전까지 작동합니다.Autofac 범위 지정 문제

public class Repository : IRepository 
{ 
    public Repository(IDbConnection) 
    { 
    } 
} 

public class Manager : IManager 
{ 
    public Manager(IRepository) 
    { 
    } 
} 

public AutofacValidatorFactory : ValidatorFactoryBase 
{ 
} 

public MyModelValidator : AbstractValidator<MyModel> 
{ 
    public MyModelValidator(IManager) { } 
} 

그래서 같이 모든 철사 :

builder.Register(c => new SqlConnection(ConfigurationManager.ConnectionStrings["MyCS"].ConnectionString)) 
       .As<IDbConnection>().InstancePerApiRequest(); 

builder.RegisterType<Repository>() 
       .As<IRepository>() 
       .InstancePerDependency(); 

builder.RegisterType<Manager>() 
       .As<IManager>() 
       .InstancePerDependency(); 

builder.RegisterType<ValidatorFactory>() 
       .As<IValidatorFactory>() 
       .InstancePerLifetimeScope(); 

     builder.RegisterType<FluentValidation.Mvc.WebApi.FluentValidationModelValidatorProvider>() 
       .As<ModelValidatorProvider>() 
       .InstancePerLifetimeScope(); 

     AssemblyScanner.FindValidatorsInAssembly(assembly) 
         .ForEach(
          result => 
          Builder.RegisterType(result.ValidatorType).As(result.InterfaceType).InstancePerApiRequest()); 

을 마지막으로, 내가 FluentValidator 모델 제공자과 같이 추가 : 내 검사기 공장이 회전 할 때

// _validatorProvider is injected as per Autofac config above.  
GlobalConfiguration.Configuration.Services.Add(typeof(ModelValidatorProvider), _validatorProvider); 

문제가 발생 validator 인스턴스를 설정합니다. 어떤 점에서 나는 다음과 같은 예외 얻을 :.

"태그 일치하는 'AutofacWebRequest'와 어떤 범위는 인스턴스가 요청 된의 범위에서 보이지을 이것은 일반적으로 요구가 당 HTTP와 같은 구성 요소가 등록 된 것을 나타냅니다 SingleInstance() 구성 요소 (또는 이와 유사한 시나리오)에서 요청할 수 있습니다. 웹 통합에서는 항상 DependencyResolver.Current 또는 ILifetimeScopeProvider.RequestLifetime의 종속성을 요청하고 컨테이너 자체는 요청하지 마십시오. "

관리자가 & 저장소가 Autofac에서 구성되었지만 내가 무엇이 빠져 있는지 모르는 방법과 관련이 있다고 생각합니다.

편집 :이 문제는 웹 API 프로젝트에서 발생합니다. 나는 당신의 직접적인 질문에 대답 할 수없는 코드의 자세한 내용을 보지 않고

+1

어떻게 검사기를 해결합니까? Validator 팩토리 구현을 게시 할 수 있습니까? –

답변

2

그러나 나는이 예외는 일반적으로

Autofac 중첩 된 수명 범위 (즉, 하위 컨테이너)을 지원을 무엇을 의미하는지 응답 할 수 있습니다. 기본 컨테이너는 실제로 루트 수명 범위입니다. 각 수명 범위는 작업 단위로 생각할 수 있습니다. 평생 범위를 만들고 해당 작업을 수행하는 데 필요한 인스턴스를 확인한 다음 평생 범위를 삭제합니다. 그런 다음 평생 범위에서 생성 된 모든 항목이 삭제됩니다.

SingleInstance로 등록하면 단일 인스턴스가 확인되고 루트 범위에 저장된다는 의미입니다. InstancePerLifetimeScope를 사용하면 해결 된 범위 당 각 인스턴스가 다시 만들어 지므로 루트 범위와 자식 범위에서 인스턴스가 끝날 수 있습니다. InstancePerMatchingLifetimeScope를 사용하면 트리의 특정 분기에있는 모든 하위 컨테이너에서 유형을 등록 할 수 있습니다. 이러한 유형은 루트 범위의 모든 항목에 의해 존재하거나 액세스 할 수 없습니다. InstancePerApiRequest는 InstancePerMatchingLifetimeScope ("AutofacWebRequest")와 동일합니다.

응용 프로그램에서 각 요청은 자식 자동 범위가됩니다. 하위 범위에 등록 된 항목 (즉, IDBConnection)은 동일한 범위 (InstancePerLifetimeScope로 등록 됨) 및 상위 범위에있는 항목 (SingleInstance로 등록 된 항목)을 사용할 수 있지만 여기서 잠재적 인 문제가 있습니다. 상위 범위에 등록 된 항목 (예 : 루트 컨테이너의 SingleInstance)은 부모 범위가 자식 범위에있는 인스턴스에 대한 액세스 권한이 없으므로 하위 범위에서 InstancePerMatchingLifetimeScope로 등록 된 항목에 액세스 할 수 없습니다.

이것이 가장 가능성있는 일입니다. Matching Lifetime 범위에 등록 된 것에 종속 된 SingleInstance로 등록한 것입니다.