8

Tôi đang sử dụng thư viện FluentValidation để thực thi một hạn chế duy nhất trên một trong những mô hình của tôi:Tiêm một DbContext thành một validator FluentValidation

public class Foo { 
    // No two Foos can have the same value for Bar 
    public int Bar { get; set; } 
} 

public class FooValidator : AbstractValidator<Foo> { 

    public FooValidator(ApplicationDbContext context) { 
     this.context = context; 

     RuleFor(m => m.Bar) 
      .Must(BeUnique).WithMessage("Bar must be unique!"); 
    } 

    private readonly ApplicationDbContext context; 

    public bool BeUnique(int bar) { 
     return !context.Foos.Any(foo => foo.Bar == bar); 
    } 
} 

Giá trị ApplicationDbContext được tiêm sử dụng StructureMap. Để đảm bảo rằng bối cảnh được xử lý ở cuối mỗi yêu cầu, tôi đã cố gắng gọi ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects() trong trình xử lý EndRequest cho đơn đăng ký của mình.

Thật không may, có vẻ như phương pháp Application_EndRequest được gọi trước khi lớp trình xác thực của tôi có thể thực hiện công việc của mình và ngữ cảnh được xử lý theo thời gian FooValidator.BeUnique được thực hiện.

Có cách nào tốt hơn để thực hiện xác nhận phụ thuộc vào cơ sở dữ liệu với thư viện FluentValidation hay là giải pháp duy nhất để chuyển logic này sang nơi khác (hành động bộ điều khiển, chính DB hoặc ở nơi khác)?

+0

Có thể trình xác thực không phải là http phạm vi (nhưng singleton) và nó không được tạo lại/tiêm với một ngữ cảnh mới? Vì vậy, có lẽ nó cố gắng sử dụng một bối cảnh xử lý từ một yêu cầu trước đó? Chỉ cần đoán, tôi không biết StructureMap cụ thể. –

+0

Nhận xét của bạn là chính xác, các lớp xác nhận là Singleton scoped. Bạn muốn gửi câu trả lời đó để tôi có thể cung cấp tín dụng? –

Trả lời

7

Có thể trình xác thực không phải là http phạm vi (nhưng singleton) và nó không được tạo lại/tiêm với một ngữ cảnh mới? Trong trường hợp này, nó cố gắng sử dụng một bối cảnh được xử lý từ một yêu cầu trước đó.

Các vấn đề liên quan