मैं डब्ल्यूपीएफ में एक विजुअल स्टूडियो जैसी एप्लिकेशन बना रहा हूं और मुझे अपने घटकों के सर्वोत्तम वास्तुशिल्प डिजाइन संगठन की पहचान करने में कुछ समस्याएं आ रही हैं। मैं एकता का उपयोग अपने निर्भरता-इंजेक्शन कंटेनर और विजुअल स्टूडियो यूनिट परीक्षण ढांचे और शायद मॉकिंग लाइब्रेरी के लिए moq के रूप में करने की योजना बना रहा हूं।यूनिटी और यूनिट परीक्षण वास्तुशिल्प डिजाइन के साथ एमवीवीएम
मैं पहली बार मेरी समाधान की संरचना, मेरे सवालों व्याख्या करेंगे तो:
मैं एक WPF परियोजना शामिल है: आवेदन स्टार्टअप पर
- मेरे एकता कंटेनर प्रारंभ (bootstrapper) (App.xaml.cs में)
- मेरे सभी एप्लिकेशन दृश्य (XAML)।
एक अन्य परियोजना ViewModel कहा जाता है इस में शामिल हैं:
- सभी अपने आवेदन ViewModels।
- आवेदन स्टार्टअप
- एकता कंटेनर निर्माण और प्रकार के पंजीकरण: MainView और MainViewModel
- मेरे सभी ViewModels एक ViewModelBase जो एक ILogger संपत्ति
मेरे आरंभीकरण तर्क इस प्रकार है को उजागर करता है से विरासत मेरे मुख्य दृश्य को हल करें और इसे दिखाएं।
public MainView(MainViewModel _mvm)
मेरे MainViewModel अपने पैनलों में से प्रत्येक के लिए एक बच्चे की ViewModel है:
var window = Container.Resolve<MainView>();
window.Show();
मेरे MainView निर्माता अपने निर्माता में एक MainViewModel वस्तु प्राप्त करता है
public ToolboxViewModel ToolboxVM{get; set;}
public SolutionExplorerViewModel SolutionExplorerVM { get; set; }
public PropertiesViewModel PropertiesVM { get; set; }
public MessagesViewModel MessagesVM { get; set; }
और मैं एक विधि InitializePanels() कि पैनलों में से प्रत्येक initializes बनाने की योजना बना रहा हूँ।
अब मेरे प्रश्न: मेरा मेनव्यू मॉडेल। प्रारंभिक पैनल() उन सभी पैनलों को कैसे प्रारंभ कर सकता है? दिए गए निम्नलिखित विकल्पों:
विकल्प 1: मैन्युअल ViewModels प्रारंभ:
ToolboxVM = new ToolboxViewModel();
//Same for the rest of VM...
विपक्ष:
- मैं एकता कंटेनर का उपयोग नहीं कर रहा हूँ तो मेरे निर्भरता (जैसेILogger) स्वचालित रूप से समाधान नहीं होता
विकल्प 2:
- मुझे लगता है कि एकता सेटर निर्भरता पढ़ा है:
[Dependency] public ToolboxViewModel ToolboxVM{get; set;} //... Same for rest of Panel VM's
विपक्ष: मेरे गुण व्याख्या द्वारा सेटर इंजेक्शन उपयोग इससे बचा जाना चाहिए क्योंकि वे इस मामले में एकता के साथ निर्भरता उत्पन्न करते हैं
- मैंने यह भी पढ़ा है कि आपको यूनिट टेस्ट के लिए एकता का उपयोग करने से बचना चाहिए, तो इस यूनिट टेस्ट में इस निर्भरता को स्पष्ट कैसे करें? कई आश्रित गुण होने के बाद कॉन्फ़िगर करने के लिए एक दुःस्वप्न हो सकता है।
विकल्प 3:
public MainViewModel(ToolboxViewModel _tbvm, SolutionExploerViewModel _sevm,....)
पेशेवरों:
-
तो वे स्वचालित रूप से एकता कंटेनर से हल कर रहे हैं MainViewModel निर्माता के लिए सभी मेरी पैनल ViewModels पारित करने के लिए उपयोग एकता निर्माता इंजेक्शन
- सृजन के समय निर्भरता स्पष्ट और स्पष्ट होगी, जो मेरे व्यू मॉडेल यूनिटटेस्ट बनाने में मदद कर सकती है।
विपक्ष:
- इतने सारे निर्माता पैरामीटर होने को बहुत शीघ्र
विकल्प 4 बदसूरत हो सकता है: कंटेनर निर्माण पर मेरे सारे वीएम प्रकार का पंजीयन। तब मेरे MainViewModel के निर्माता इंजेक्शन के माध्यम से UnityContainer उदाहरण गुजर:
public MainViewModel(IUnityContainer _container)
इस तरह मैं की तरह कुछ कर सकता है:
Toolbox = _container.Resolve<ToolboxViewModel>();
SolutionExplorer = _container.Resolve<SolutionExplorerViewModel>();
Properties = _container.Resolve<PropertiesViewModel>();
Messages = _container.Resolve<MessagesViewModel>();
विपक्ष:
- अगर मैं तय उपयोग करने के लिए नहीं मेरे यूनिटटेस्ट्स के लिए एकता, जैसा कि कई लोग सुझाव देते हैं, तो मैं अपने पैनल व्यू मॉडेल को हल और प्रारंभ करने में सक्षम नहीं हूं।
यह देखते हुए कि लंबी व्याख्या, सबसे अच्छा तरीका क्या है ताकि मैं निर्भरता इंजेक्शन कंटेनर का लाभ उठा सकूं और यूनिट-टेस्टेबल समाधान के साथ समाप्त हो सकूं ??
अग्रिम धन्यवाद,
आप पूरी तरह से सही हैं। मुझे इंटरफेस के खिलाफ कोड करना चाहिए और कंक्रीट कार्यान्वयन नहीं करना चाहिए, हालांकि, मैं आम तौर पर कंक्रीट कक्षाओं को कोडिंग करना शुरू करता हूं और फिर रिशेर्पर के साथ अपने इंटरफेस निकालता हूं, अभी तक उस बिंदु तक नहीं पहुंच पाया है, लेकिन मैं जल्द ही जाऊंगा! –
मेरा त्वरित और गंदा समाधान यह है कि संसाधनों के रूप में app.xaml में मेरे दृश्य मॉडल को तुरंत चालू करें, फिर आवश्यकतानुसार गठबंधन करें। ' 'जो यूनिट परीक्षण को सेट अप करने में आसान बनाता है। –
Will