अपनी टिप्पणी मैं इसके द्वारा मेरा उत्तर :)
ModelStateDictionary
स्पष्ट रूप से एक सेवा कि कंटेनर से सुलझाया जाना चाहिए नहीं है, बल्कि डेटा कि ऐसा करना चाहिए संशोधन के आधार पर तत्काल समय पर प्रदान किया जाना चाहिए। हम यह बता सकते हैं कि मॉडलस्टेट का प्रत्येक नियंत्रक उदाहरण के स्वामित्व में है और इस प्रकार "हल समय" पर कंटेनर के लिए उपलब्ध नहीं है।
इसके अलावा, प्रत्येक ModelValidation
उदाहरण एक ModelStateDictionary
उदाहरण के लिए बाध्य होंगे और डेटा रूप में माना जा करने के लिए इस प्रकार भी है।
ऑटोफैक में, जब डेटा कन्स्ट्रक्टर (वैकल्पिक रूप से अन्य निर्भरताओं के अतिरिक्त) को पारित किया जाना चाहिए, तो हमें फैक्ट्री प्रतिनिधियों का उपयोग करना होगा। ये प्रतिनिधि रचनाकार को पास निर्भरता और डेटा को संभालेगा। ऑटोफैक के साथ मीठा चीज यह है कि इन प्रतिनिधियों को स्वत: उत्पन्न किया जा सकता है।
मैं निम्नलिखित समाधान प्रस्तावित:
के बाद से दोनों ModelValidation और customerservice उनके निर्माताओं में डेटा की आवश्यकता है, हम दो कारखाने प्रतिनिधियों (ध्यान दें: पैरामीटर नाम उनके इसी निर्माता के नाम से मेल खाना चाहिए): जरूरत
public delegate IModelValidation ModelValidationFactory(ModelStateDictionary msd);
public delegate CustomerService CustomerServiceFactory(ModelStateDictionary msd);
अपने नियंत्रकों के बाद से पता नहीं करना चाहिए, जहां इन प्रतिनिधियों आता है वे निर्भरता के रूप में नियंत्रक निर्माता को पारित किया जाना चाहिए से:
public class EditCustomerController : Controller
{
private readonly CustomerService _customerService;
public EditCustomerController(CustomerServiceFactory customerServiceFactory
/*, ...any other dependencies required by the controller */
)
{
_customerService = customerServiceFactory(this.ModelState);
}
}
customerservice एक निर्माता इस के समान होना चाहिए (वैकल्पिक रूप से एक ServiceBase कक्षा में इस में से कुछ संभाल):
var builder = new ContainerBuilder();
builder.Register<ModelValidation>().As<IModelValidation>().FactoryScoped();
builder.Register<CustomerService>().FactoryScoped();
builder.RegisterGeneratedFactory<ModelValidationFactory>();
builder.RegisterGeneratedFactory<CustomerServiceFactory>();
builder.Register<EditCustomerController>().FactoryScoped();
:
public class CustomerService
{
private readonly IModelValidation _modelValidation;
public CustomerService(ModelStateDictionary msd,
ModelValidationFactory modelValidationFactory)
{
_modelValidation = modelValidationFactory(msd);
}
ऐसा हम इस तरह हमारे कंटेनर का निर्माण करने की आवश्यकता बनाने के लिए इसलिए, जब नियंत्रक को हल किया जाता है (उदाहरण के लिए the MvcIntegration module का उपयोग करते समय), कारखाने के प्रतिनिधियों को नियंत्रकों और सेवाओं में इंजेक्शन दिया जाएगा।
अद्यतन: आवश्यक कोड में कटौती करने के लिए और भी अधिक है, तो आप एक सामान्य कारखाना प्रतिनिधि के साथ CustomerServiceFactory
बदल सकते है जैसे मैं here वर्णन किया है।
में लागू किया जाना चाहिए बस एक संभवतः दिलचस्प विचार है कि आप कारखाने प्रतिनिधियों के एक समूह की घोषणा से बचत होगी साथ मेरा उत्तर अपडेट किया गया। –