2016-07-29 5 views
2

: 나는 FluentValidation에 엔티티 프레임 워크 컨텍스트를 주입내가하는 ASP.NET 핵심 응용 프로그램의 시작에 다음과 같은 한

services.AddDbContext<Context>(x => x.UseSqlServer(connectionString)); 

services.AddFluentValidation(x => x.RegisterValidatorsFromAssemblyContaining<Startup>()); 

검증 :

public class TestModelValidator : AbstractValidator<TestModel> { 
    public TestModelValidator(Context context) { 
    } 
} 

나는 다음과 같은 오류 얻을 :

ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur is you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. 
Object name: Context 

내가 무엇을 놓치고를?

의견에서 언급 한 바와 같이
+0

'AddFluentValidation'은 (는) 싱글 톤으로 등록합니까? 기본 설정은 'DbContext'이 범위의 서비스로 등록되고 각 요청 후 배치받을 – Tseng

+0

예, 유창 검증이 싱글로 추가 (상태를 추적 DbContext하여 메모리 누수를 방지하기 위해) 때문이다 때문에, 싱글에 DbContext를 삽입 할 수 없습니다. 하지만 Func 을 주입하려고 시도한 결과 같은 오류가 발생했습니다. 해야합니까? –

+0

어떻게'Func '을 등록하셨습니까? 올바르게 등록 된 경우 팩토리 메서드가 실제로 작동해야합니다. – Tseng

답변

1

, 유효성 검사기는 기본적으로 singletones으로 인스턴스화, 나는 강하게 당신 때문에 perfomance 이유로 검증 수명을 변경하지 않는 것이 좋습니다 - 그들은 인스턴스화하는 것은 매우 비싸다. 평생 불균형이 방법의 해결 문제 -

나는 (일명 Must) 표현 본체 PredicateValidator 내부 수요 경량 Context 객체를 인스턴스화하는 것을 선호합니다. ServiceLocator 패턴

예 :이 항목은 implementation of service locator with AutoFac을 위해 도움이 될 수

public class MyValidator: AbstractValidator 
{ 
    public MyValidator() 
    { 
     RuleFor(x => x.Email).Must(email => IsUnique(email)).WithMessage("email must be unique"); 
    } 

    private IsUnique(string email) 
    { 
     var context = !ServiceLocator.Instance.Resolve<Context>(); 
     return context.Users.Any(x => x.Email == email); 
    } 
} 

.