7

मेरे पास एक निर्माता के साथ एक दृश्य मॉडल है जिसके लिए एक सेवा की आवश्यकता है। मैं गैलासोफ्ट के एमवीएमएमलाइट का उपयोग कर रहा हूं जो व्यू मॉडल को देखने के लिए एक सेवा लोकेटर का उपयोग करता है।एमवीवीएम व्यू मॉडल और एसिंक डेटा प्रारंभिकरण

सरल आईओसी व्यूमोडल्स कन्स्ट्रक्टर ठीक करने के लिए सेवा प्रदान करता है, लेकिन मुझे किसी भी तरह से डेटा स्रोत से डेटा के साथ अपने व्यूमोडेल को पॉप्युलेट करने की आवश्यकता है। मेरे ViewModel इस तरह एक लग रहा है: -

public class MainPageViewModel : ViewModelBase 
{ 
    private readonly GroupService _groupService; 
    private readonly GroupFactory _groupFactory; 
    private readonly ObservableCollection<GroupVM> _groupVms = new ObservableCollection<GroupVM>(); 


    public MainPageViewModel(Domain.Services.GroupService groupService, VMFactories.GroupFactory groupFactory) 
    { 
     _groupService = groupService; 
     _groupFactory = groupFactory; 
    } 

    public async Task Init() 
    { 
     var groups = await _groupService.LoadGroups(); 
     foreach (var group in groups) 
     { 
      GroupVms.Add(_groupFactory.Create(group)); 
     } 
    } 

    public ObservableCollection<GroupVM> GroupVms { get { return _groupVms; } } 
} 

किसी तरह init विधि एक बहुप्रतीक्षित कॉल किया जाना चाहिए, लेकिन मैं कैसे सबसे अच्छा यह करने के लिए पता नहीं है? मैं तीन विकल्प के बारे में सोच सकते हैं: -

  1. मैं सिर्फ निर्माता पर Init फोन, लेकिन नहीं यह इंतजार है (मैं thats पता वास्तव में बुरा व्यवहार)
  2. मैं ViewModelLocator वस्तु पर Init कहते हैं, लेकिन जब से मैं नहीं कर सकता एक कार्य वापस करें मैं फिर से init का इंतजार नहीं कर सकता
  3. दृश्य के लोड पर मैंने डेटाकॉन्टेक्स्ट को किसी प्रकार के IAsyncViewmodel पर डाला और init विधि का इंतजार किया।

मैंने पिछले विंडोज 8 स्टोर प्रोजेक्ट में विकल्प 3 का उपयोग किया है, लेकिन यह गलत लगता है। किसी भी सलाह की वास्तव में सराहना की जाएगी!

धन्यवाद

रॉस

उत्तर

7

मुझे उत्सुकता है कि आप एसिंक कॉल को खराब अभ्यास का इंतजार क्यों नहीं करते हैं। मेरी राय में, जब तक आप जानते हैं कि इसका अर्थ क्या है, तब तक यह बुरा नहीं है, कि कॉल पृष्ठभूमि में निष्पादित की जाएगी और किसी भी समय वापस आ सकती है।

आमतौर पर मैं क्या करता हूं कि मैं डिजाइन समय डेटा निर्माण उद्देश्य के लिए निर्माता में एसिंक विधि को कॉल करता हूं और मैं इसका इंतजार नहीं करता हूं। मैं सिर्फ प्रॉपर्टी चेंज और कलेक्शन चेंजेड इवेंट्स को बढ़ाने का ख्याल रखता हूं जहां बाइंडिंग अपडेट होने की आवश्यकता होती है, और यह चाल है।

चीयर्स लॉरेंट

+0

अच्छा बिंदु, यह उन चीज़ों में से एक था जो मैंने लिया था लेकिन वास्तव में इसके बारे में सोचा नहीं था। यहां इसके बारे में कुछ और जानकारी है: http://stackoverflow.com/questions/7261173/c-sharp-start-async-method-within-object-constructor-bad-practice मूल रूप से ऐसा इसलिए होता है क्योंकि जब वस्तु का निर्माण होता है तो यह अभी भी " सामान कर रहे हैं "शायद अप्रत्याशित रूप से, साथ ही अपवादों को संभालना बहुत मुश्किल है। मैंने दोनों तरीकों की कोशिश की है, और मुझे लगता है कि मैं निर्माता में init पसंद करते हैं, लेकिन अभी भी यकीन नहीं है! –

+0

टिप: विजुअल स्टूडियो में 'squigglies' से बचने के लिए बस लौटा कार्य के मूल्य को एक डमी चर पर असाइन करें –

1

मैं MvvmLight साथ के रूप में परिचित के रूप में मैं एक बार था नहीं हूँ, लेकिन मैं विभिन्न तरीकों से में async कंस्ट्रक्टर्स से निपटने के लिए कोशिश की है।

विकल्प (1) में जटिलताओं को संभालने में त्रुटि है। विकल्प (3) InitAsync को सुलभ होने के लिए मजबूर करता है।

मैं एक async कारखाने दृष्टिकोण (जैसे, विकल्प (2), जहां DataContextnull रहना होता था जब तक वीएम आरंभीकरण पूरा करता है) पसंद करते हैं, लेकिन ViewModelLocator की तरह उस के लिए काम नहीं करेगा यह लग रहा है। तो (अभी के लिए) आपको async फैक्ट्री के बीच चयन करना है जो आईओसी और अन्य विकल्पों में से एक (1 या 3) का उपयोग नहीं करता है जो आदर्श नहीं हैं।

व्यक्तिगत रूप से, मैं वीएम/व्यू बाध्यकारी के लिए आईओसी को बाहर निकाल दूंगा (मैं कभी भी इसके लिए आईओसी का उपयोग नहीं करता; मेरे विचार मेरे वीएम पर निर्भर करते हैं) और async फैक्ट्री विधि का उपयोग करें। हालांकि, यदि आप आईओसी के साथ रहना चाहते हैं तो अन्य विकल्प पूरी तरह व्यवहार्य हैं। वीएम के लिए मुझे लगता है कि विकल्प (1) विकल्प (3) से थोड़ा बेहतर होगा यदि आपके पास हमेशा InitAsync विधियों में शीर्ष-स्तर try/catch था।

+0

धन्यवाद, मैं सवाल अब थोड़ा के लिए खुला छोड़ देंगे के रूप में मैं इस पर अन्य लोगों के विचारों को सुनना पसंद करेंगे। –

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