WCF

2012-12-19 10 views
7

के माध्यम से किसी इकाई के गणना डेटा का खुलासा कैसे करें हम क्लाइंट (प्रस्तुति) और सर्वर (डेटा/व्यवसाय परत) के बीच डब्ल्यूसीएफ का उपयोग करके एक एन-स्तरीय आर्किटेक्चर एप्लिकेशन विकसित कर रहे हैं। ईमानदार होने के लिए मुझे डब्ल्यूसीएफ के माध्यम से कुशलता से गणना किए गए डेटा का खुलासा करने के बारे में कोई वास्तविक उदाहरण/जानकारी नहीं मिल रही है।WCF

मेरी समस्या का वर्णन करने के लिए कहें कि हमारे पास एटीएम मशीनें हैं जिनमें बहुत सारे लेन-देन हैं। तो हमारे पास एटीएम कक्षा और लेनदेन वर्ग के बीच 1-एन संबंध है। एटीएम क्लास में स्थान, मॉडलनो, विवरण, इंस्टालडेट और लेनदेन रिकॉर्ड जैसी संपत्तियां हैं, राशि, डेटटाइम, ग्राहकइन्फो, टिकटपेपर लम्बाई, बिजली का उपयोग

डब्ल्यूसीएफ के माध्यम से इन कक्षाओं का खुलासा करना कोई मुद्दा नहीं है। समस्या यह है कि हमारे पास एटीएम के लिए बहुत से गणना किए गए फ़ील्ड हैं जो अंतर्निहित लेनदेन तालिका पर आधारित हैं। उदाहरण के लिए, क्लाइंट एप्लिकेशन एटीएम के गणना डेटा के आधार पर रिपोर्ट का उपयोग करता है। एटीएम के गणना आंकड़ों के उदाहरण हो सकते हैं: औसत टिकटपेपर लम्बाई, औसत राशि, विचलन राशि, औसत इलेक्ट्रिकिटी, इत्यादि। इन बहुत सारे गणना किए गए डेटा हैं। गणना सर्वर पर होनी चाहिए, न कि क्लाइंट-साइड पर। यदि ये रिपोर्ट परिभाषाएं सभी तय की गईं तो यह बड़ी समस्या नहीं होगी: रिपोर्ट के लिए हम अलग-अलग सेवाएं/पोको बना सकते हैं। गणना को व्यावसायिक परत में रखें और आवश्यकतानुसार पोको भरें। लेकिन क्लाइंट एप्लिकेशन में एटीएम की गणना की गई किसी भी सेट पर फ़िल्टर की गई रिपोर्ट बनाने की क्षमता होनी चाहिए और डेटा के रूप में (गणना) गुणों के दूसरे सेट के रूप में वापस लौटना चाहिए।

मैं लगभग 500 गणना गुणों के साथ एक पोको बना सकता हूं जहां प्रत्येक एकल रिपोर्ट के लिए केवल 10 गुणों का उपयोग किया जा सकता है। लेकिन निश्चित रूप से हम नहीं चाहते हैं कि प्रत्येक इकाई के लिए हर बार 500 गणनाएं निष्पादित हों।

तो आम तौर पर मैं सोच रहा हूं कि कोई व्यक्ति किसी इकाई के गणना डेटा को कैसे एक्सप्लोर करेगा। WCF। एंटिटी फ्रेमवर्क, पोको और डब्ल्यूसीएफ समझाते हुए लगभग सभी उदाहरण केवल इकाई के लगातार क्षेत्रों से निपटते हैं और यह बहुत सीधी-आगे है।

उत्तर

7

डब्लूसीएफ के माध्यम से इकाइयों का पर्दाफाश न करें, कुछ डीटीओ बनाएं।

उदाहरण के लिए:

WCF परत में -

DtoInfoForReport1 GetInfoForReport1(long atmId) { ... call BL here... } 
DtoInfoForReport2 GetInfoForReport2(long atmId) { ... call BL here... } 

डेटा परत में -

AtmEntity 
{ 
    long Id {get;set;} 
    ... some properties ... 
    HashSet<Transaction> AtmTransactions {get;set;} 
} 

स्थानांतरण वस्तुओं -

DtoInfoForReport1 
{ 
    long AtmId {get;set;} 
    XXX SomeCalculatedValue {get;set;} 
} 

बीएल में -

DtoInfoForReport1 CreateInfoForReport1(long atmId) 
{ 
    var atm = YYY.GetEntity<AtmEntity>(atmId); 
    return new DtoInfoForReport1 
    { 
    AtmId = atmId, 
    SomeCalculatedValue = DoSomeCalculationOverMyAtmWithItsTransactions(atm), 
    }; 
} 

आशा है कि मुझे आपका प्रश्न सही मिलेगा। अन्यथा टिप्पणी करें।

संपादित करें टिप्पणी के आधार पर: से मैं इस तरह DTOs सुझाव है:

[DataContract] 
public DtoRequestedCalculations 
{ 
    [DataMember] 
    public long AtmId {get;set;} 

    [DataMember] 
    public List<DtoRequestedCalculationEntry> Calculations {get;set;} 
} 

[DataContract] 
public DtoRequestedCalculationEntry 
{ 
    [DataMember] 
    public string/long/Guid/XXX ParameterIdentifier {get;set;} 

    [DataMember] 
    public double/ DtoParameterCalculatedValueBase {get;set;} 
} 

अब आप अपने गणना मूल्य हमेशा यह दोगुनी है मूल रूप से किया जाता है, तो। DtoParameterCalculatedValueBase, जो इस तरह sth है - अपने मूल्यों है या विभिन्न प्रकार के कर सकते हैं, तो आप कुछ आधार वर्ग की आवश्यकता होगी:

[DataContract] 
[KnownType(typeof(DtoParameterDoubleCalculatedValue))] 
[KnownType(typeof(DtoParameterXXXCalculatedValue))] 
public DtoParameterCalculatedValueBase 
{ 
    ...whatever common part there may be or nth... 
} 

public DtoParameterDoubleCalculatedValue : DtoParameterCalculatedValueBase 
{ 
    [DataMember] 
    public double Value {get;set;} 
} 

public DtoParameterXXXCalculatedValue : DtoParameterCalculatedValueBase 
{ 
    [DataMember] 
    public XXX Value {get;set;} 
} 

नोट KnownType विशेषता - यह WCF क्या प्रकार के आधार वर्ग के स्थान पर आ सकता है बताता है।आपको प्रत्येक विरासत प्रकार के लिए यह विशेषता प्रदान करनी होगी (या डेटाकंट्रैक्ट रीसोलवर का उपयोग करें, जो पहले से ही एक और कहानी है)।

WCF में से

:

DtoRequestedCalculations GetCalculatedValuesForAtm(long atmId, List<long/string/ Guid/XXX> valueIdentifiers); 
+0

सामान्य तौर पर मैं डीटीओ का उपयोग करते हुए इस बात से सहमत। आपकी व्याख्या मेरी समस्या को काफी हद तक बताती है। समस्या यह है कि मुझे सटीक परिभाषा नहीं पता है उदा। फोरहैंड पर GetInfoForReport1 और GetInfoForReport2। अन्य रिपोर्ट भी हो सकती हैं और मुझे नहीं पता कि उपयोगकर्ता किस डेटा का अनुरोध करता है। अंतिम उपयोगकर्ता एटीएम से कुछ गणना किए गए फ़ील्ड का चयन करता है और एक रिपोर्ट का अनुरोध करता है। फ़ील्ड के प्रत्येक संभावित संयोजन के लिए डीटीओ बनाने के लिए थोड़ा अधिक – Erik

+0

उत्तर –

+0

ठीक है, तो डब्ल्यूसीएफ GetCalculatedValuesForAtm के साथ विचार यह है कि मूल्य आईडीडिएंटर्स संबंधित गणनाओं को संदर्भित करता है? लेकिन इसके लिए अभी भी आवश्यकता होगी कि यदि आप एटीएम की एक सूची चाहते हैं जिसमें उच्च औसत इलेक्ट्रिकिटी है तो आपको सभी एटीएम पर फिर से शुरू करना होगा और प्रत्येक एटीएम के लिए औसत इलेक्ट्रिकिटी के लिए इस डब्ल्यूसीएफ को कॉल करना होगा। (केवल यह समझते हुए कि मेरा मतलब 1 एटीएम की रिपोर्ट के बजाय सभी एटीएम पर रिपोर्ट था। इसका मूल प्रश्न में उल्लेख नहीं किया गया था) – Erik

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