2016-07-29 17 views
2

:私はFluentValidationにEntity Frameworkのコンテキストを注入私はASP.NET Coreアプリケーションの起動時に以下のいる

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が状態を追跡することによって、メモリリークを避けるために) 'DbContext'がスコープサービスとして登録され、各要求の後に配置され得るということですので、あなたははい、流暢な検証がシングルトンとして追加 – Tseng

+0

、シングルトンでDbContextを注入することはできません。しかし、私はまたのFunc を注入しようとしたと私は同じエラーを取得します。したほうがいい? –

+0

はどのようにして ''のFunc を登録したのですか?ファクトリメソッドはのFuncでは動作しませんコンテキストを登録するときに正しく – Tseng

答えて

1

、デフォルトでsingletonesとしてインスタンスバリ、と私は強くあなたが原因もパフォーマンス上の理由にバリデータの存続期間を変更しないことをお勧めします - 彼らは、インスタンス化することは非常に高価です。

私はPredicateValidator(別名Must)式本体内部のオンデマンドで軽量の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); 
    } 
} 

関連する問題