8

मैं FluentValidation पुस्तकालय का उपयोग कर रहा मेरी मॉडलों में से एक पर एक अद्वितीय बाधा को लागू करने में एक DbContext इंजेक्शन:एक 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); 
    } 
} 

ApplicationDbContext मूल्य StructureMap का उपयोग कर इंजेक्ट किया जाता है। यह सुनिश्चित करने के लिए कि प्रत्येक अनुरोध के अंत में संदर्भ का निपटारा किया गया है, मैंने अपने आवेदन के लिए EndRequest हैंडलर में ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects() पर कॉल करने का प्रयास किया।

दुर्भाग्य से, ऐसा लगता है कि Application_EndRequest विधि को मेरे सत्यापनकर्ता वर्ग के काम करने में सक्षम होने से पहले कहा जाता है और संदर्भ FooValidator.BeUnique द्वारा निष्पादित किया जाता है।

क्या FluentValidation लाइब्रेरी के साथ डेटाबेस-निर्भर मान्यताओं को करने का कोई बेहतर तरीका है, या इस तर्क को कहीं और स्थानांतरित करने का एकमात्र समाधान है (या तो नियंत्रक कार्रवाई, डीबी स्वयं, या शायद कहीं और)?

+0

शायद वैधकर्ता http scoped (लेकिन सिंगलटन) नहीं है और इसे एक नए संदर्भ के साथ पुनर्निर्मित/इंजेक्शन नहीं दिया गया है? तो शायद यह पिछले अनुरोध से एक निपटान संदर्भ का उपयोग करने की कोशिश करता है? बस अनुमान लगाते हुए, मैं स्ट्रक्चर मैप को ठोस रूप से नहीं जानता। –

+0

आपकी टिप्पणी सही थी, सत्यापन वर्ग सिंगलटन स्कॉप्ड थे। इसे उत्तर के रूप में सबमिट करना चाहते हैं तो मैं इसे क्रेडिट दे सकता हूं? –

उत्तर

7

हो सकता है कि वैधकर्ता http scoped (लेकिन सिंगलटन) नहीं है और इसे एक नए संदर्भ के साथ पुनर्निर्मित/इंजेक्शन नहीं दिया गया है? इस मामले में यह पिछले अनुरोध से एक निपटान संदर्भ का उपयोग करने की कोशिश करता है।

संबंधित मुद्दे