2009-11-30 14 views
5

मेरे पास ModelStateDictionary पर एक रैपर है जो मेरी सभी सेवाएं स्वीकार करता है। क्या नियंत्रक मॉडलस्टेट डिक्शनरी को रैपर के कन्स्ट्रक्टर में इंजेक्ट करने के लिए ऑटोफैक को कॉन्फ़िगर करना संभव है और फिर इसे सेवा कन्स्ट्रक्टर में इंजेक्ट करना संभव है?Autofac के साथ मेरे सेवा निर्माता को नियंत्रक के मॉडलस्टेट को कैसे पास किया जाए?

//code 
public class ModelValidation : IModelValidation { 
public ModelValidation(ModelStateDictionary msd){...} 
.. 
.. 
} 

public class CustomerService{ 
public CustomerService(IModelValidation mv){...} 
.. 
} 

धन्यवाद

+0

में लागू किया जाना चाहिए बस एक संभवतः दिलचस्प विचार है कि आप कारखाने प्रतिनिधियों के एक समूह की घोषणा से बचत होगी साथ मेरा उत्तर अपडेट किया गया। –

उत्तर

8

अपनी टिप्पणी मैं इसके द्वारा मेरा उत्तर :)

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 वर्णन किया है।

+0

कंटेनर नया मॉडलस्टेट डिक्शनरी बनाता है और इसे मॉडल वैलिडेशन कन्स्ट्रक्टर में भेजता है। मैं मौजूदा मॉडलस्टेट डिक्शनरी (जिसे नियंत्रक.मोडेलस्टेट प्रॉपर्टी के माध्यम से सुलभ है) मॉडल वैलिडेशन कन्स्ट्रक्टर को पास करना चाहता हूं। क्या यह संभव है? – Valentin

+0

क्या आप इसे अपने प्रश्न में विस्तारित कर सकते हैं? नियंत्रक है। मॉडल स्थिर एक स्थिर? या आज इसे कैसे घोषित किया जाता है? –

+0

नियंत्रक। मॉडलस्टेट मॉडलस्टेट डिक्शनरी प्रकार की एक संपत्ति है। नियंत्रक एएसपीएनटी एमवीसी रनटाइम (नियंत्रक फैक्ट्री) द्वारा बनाया गया है, और मॉडलस्टेट डिक्शनरी वहां बनाई गई है। फिर मैं नियंत्रक को उप-वर्गीकरण करके अपने नियंत्रकों को बना सकता हूं और मैं अपनी कक्षा में मॉडलस्टेट संपत्ति तक पहुंचने में सक्षम हूं। अगर मैं अस्पष्ट हूं, तो कृपया मुझे बताएं और मैं अपने प्रश्न को अधिक विस्तार से दोबारा पोस्ट करूंगा। – Valentin

0

प्रमाणीकरण सेवा के बिना एक नया कन्स्ट्रक्टर जोड़ें। एक संपत्ति का उपयोग करके सत्यापन सेवा असाइन करें।

संपत्ति इंटरफ़ेस ICostumerService

public class ModelStateWrapper: IValidationDictionary { 
public ModelStateWrapper(ModelStateDictionary msd){} 
} 

public class CustomerService: ICostumerService{ 
public IValidationDictionary ValidationDictionary { get; set; } 
public CustomerService(ICustomerRepsitory customerRepository, IValidationDictionary validationDictionary){} 
public CustomerService(ICustomerRepsitory customerRepository){} 
} 

public Controller(ICustomerService customerService) 
{ 
    _customerService= menuService; 
    _customerService.ValidationDictionary = new ModelStateWrapper(this.ModelState); 
    _customerService= sportsService; 
} 
1
Builder.RegisterInstance(new ModelStateDictionary()).SingleInstance(); 
      builder.Register(c => new SW.PL.Util.ModelStateWrapper 
(c.Resolve<ModelStateDictionary>())).As<IValidationDictionary>().InstancePerHttpRequest(); 
+0

क्या आप एक उदाहरण के रूप में जोड़ सकते हैं – Farid

+0

यह प्रश्न लंबे समय तक वास्तविक, क्षमा नहीं है। मैं प्रोग्राम भी .NET प्रोग्राम नहीं करता :) – Valentin

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