2009-05-11 16 views
5

हमने एक वेब सेवा लिखी है जो डीटीओ के मूल्यों को "असली" सर्वर साइड बिजनेस ऑब्जेक्ट्स पर वापस मैप करने के लिए एक साधारण इकाई अनुवादक का उपयोग करती है। इस अभ्यास के हिस्से के रूप में। हम स्पष्ट रूप से सेट शून्य मान और वाले क्लाइंट सेट के बीच एक "रोचक" भेद में आ गए हैं।नल बनाम वैल्यू सेट नहीं

समस्या अनिवार्य है हम वास्तविक व्यापार वस्तु पर एक डिफ़ॉल्ट मान सेट करने के लिए करता है, तो ग्राहक को स्पष्ट रूप से एक मूल्य सेट नहीं किया, फिर भी मानक नल प्रकार का उपयोग कर कोई रास्ता नहीं है, तो एक ग्राहक को स्पष्ट रूप से मतलब है बताने के लिए है चाहता हूँ कि "इसे शून्य पर सेट करें" या बस इसे सेट न करें।

यहां समाधान स्पष्ट रूप से कुछ प्रकार का "ध्वज" है।

किसी व्यापार ऑब्जेक्ट के भीतर हम संपत्ति सेटर्स के भीतर सेट किए गए निजी "IsDirty" झंडे का उपयोग करके आंतरिक रूप से किसी क्षेत्र की स्थिति को ट्रैक कर सकते हैं, लेकिन एक डीटीओ केवल वास्तव में एक इंटरफेस निर्दिष्ट करता है, इसका मतलब है कि इस डेटा को जनता के सामने उजागर करना है। यह कई कार्यान्वयन विकल्पों को छोड़ देता है। भाषा सी # (इसलिए स्थाई रूप से टाइप की गई है) तो ...

  1. हम प्रत्येक संपत्ति पर "IsSet" ध्वज का पर्दाफाश कर सकते हैं?
  2. हम प्रत्येक संपत्ति को उस वर्ग के रूप में बेनकाब कर सकते हैं जिसमें एक वैल्यू और आईएससेट संपत्ति है? आदि आदि

कैसे आप पर डेटा अनुबंध इन "झंडे" दर्शाने का चयन हैं? आप यहां इसके लिए सबसे अच्छा अभ्यास के रूप में क्या मानेंगे?

इस पर किसी भी राय की सराहना की जाएगी।

उत्तर

3

प्रत्येक संपत्ति मूल्य के लिए कक्षा का उपयोग करना अधिक स्केलेबल होगा जो प्रत्येक संपत्ति के लिए एक बूल घोषित करना होगा। यह आपको यह भी चुनने में सक्षम करेगा कि कौन से गुण खाली छोड़े जा सकते हैं और/या शून्य पर सेट किए जा सकते हैं।

3

आप एक वर्ग है कि डेटा के साथ झंडे लपेटता लिख ​​सकते हैं:

public class DtoData<T> 
{ 
    T data; 
    bool IsSet { get; private set; } 
    T Data 
    { 
    get { return data; } 
    set { data = value; IsSet = true; } 
    } 
} 


public class XyzDto 
{ 
    // only private setters, initialize in constructor 
    DtoData<int?> SomeInt { get; private set; } 
    DtoData<string> SomeString { get; private set; } 
} 

यह कुछ नुकसान तो नहीं है। उदाहरण के लिए, कि आपका सभी डेटा एक संदर्भ प्रकार में लपेटा गया है, इसलिए DtoData का संदर्भ अभी भी शून्य हो सकता है, आपको उन्हें एक निर्माता में बनाना होगा। और मूल्यों को केवल आंतरिक या संरक्षित पहुंचाना मुश्किल है।


व्यक्तिगत रूप से, मैं इस समस्या से बचने की कोशिश करता हूं। वास्तव में "परिभाषित नहीं" क्यों होना चाहिए? क्या आप अंतर, अपूर्ण डीटीओ, या यह कहां से आते हैं? यह समस्या फ़िल्टर के साथ आ सकती है, जहां आपको शून्य के लिए फ़ील्ड फ़िल्टर करते हैं या यदि आप इसे फ़िल्टर नहीं करते हैं तो आपको एक अंतर की आवश्यकता है। लेकिन ऐसे परिदृश्यों के लिए, आपको वैसे भी एक विशेष "फील्ड-फ़िल्टर" कक्षा की आवश्यकता है।

0

मैं पहले इस सटीक समस्या में आया हूं। आप डीटीओ के निर्माण पर कुछ डिफ़ॉल्ट मूल्य पेश करके इसके आसपास काम कर सकते हैं, लेकिन यह आदर्श नहीं है। मैंने अधिक जानकारी here में ब्लॉग की है, इससे किसी को इस मुद्दे को और समझने में मदद मिल सकती है।

1

सामान्यतः, आप यहां जो बात कर रहे हैं वह एक डिफ़ॉल्ट मान है जो उपयोगकर्ता द्वारा निर्धारित किसी भी मूल्य से अलग है। तो बस इसे निर्दिष्ट करें; डिफ़ॉल्ट को उस मान पर सेट करें जो उपयोगकर्ता द्वारा निर्धारित मूल्यों की स्वीकार्य सीमा में नहीं है।इस तरह, यदि मान डिफ़ॉल्ट है, तो आप जानते हैं कि यह सेट नहीं किया गया है; यदि मूल्य इसके अलावा कुछ भी है, तो आप जानते हैं कि उपयोगकर्ता इसके साथ झुका हुआ है। सिर्फ इसलिए कि उपयोगकर्ता-सेटटेबल मानों में से एक शून्य है जो आपको फेंक रहा है; बस इसे उपयोगकर्ता सेटटेबल मानों के सेट में से एक माना जाता है; वैरिएबल की पूरी रेंज को एक अतिरिक्त डिफ़ॉल्ट मान के साथ थोड़ा बड़ा सेट बनाएं। इससे आपकी समस्या हल हो जानी चाहिए।

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