2010-01-26 14 views
9

मैं विभिन्न उद्देश्यों के लिए ऑब्जेक्ट को क्रमबद्ध और deserialize करने के लिए JSON.NET का उपयोग कर रहा हूं। मैं डी का बड़ा प्रशंसक हूं लेकिन नीचे दिया गया कोड मुझे ठंड देता है। खराब कोड की तरह गंध है:DI और JSON.NET

public class Foo : Baz 
{ 
    private readonly IBar bar; 

    public Foo() 
     : this(ObjectFactory.GetInstance<IBar>()) 
    { } 

    public Foo(IBar bar) 
    { 
     if (bar == null) 
      throw new ArgumentNullException("bar"); 

     this.bar = bar; 
    } 

    ... rest of class ... 
} 

डिफ़ॉल्ट निर्माता यह चीज है जो मुझे ठंड देता है। सार आधार वर्ग बाज से

string jsonString = ...; 
string concreteBazType = ...; 

Baz baz = (Baz)JsonConvert.DeserializeObject(jsonString, Type.GetType(concreteBazType); 

सूचना वर्ग फू inherrits: मैं इस JSON.NET की वजह से अक्रमांकन समर्थन करने के लिए जोड़ दिया है!

आप सभी को DI और JSON.NET geeks के लिए मेरा प्रश्न है: कोड-गंध से बचने के लिए मैं कोड में कैसे बदल सकता हूं डिफ़ॉल्ट कन्स्ट्रक्टर मुझे कक्षा फू में देता है?

उत्तर

18

यह Data Transfer Objects के सभी प्रकारों के साथ एक आम समस्या है, चाहे वे JSON.NET, WCF या अन्य तकनीकों में फिट हों। वास्तव में, आप कह सकते हैं कि सभी आवेदन सीमा-सामना कक्षाएं इस समस्या से एक डिग्री या दूसरे तक पीड़ित हैं। समस्या विंडोज फॉर्म नियंत्रण और अन्य प्रदर्शन प्रौद्योगिकियों के बराबर है।

एप्लिकेशन स्टैक के दूसरे छोर में, हम कॉन्फ़िगरेशन ऑब्जेक्ट्स और संभावित रूप से कुछ ओआरएम प्रकारों (जैसे एंटीटी फ्रेमवर्क क्लासेस) के साथ एक ही समस्या देखते हैं।

सभी मामलों में, सर्वोत्तम दृष्टिकोण इस तरह के सीमा ऑब्जेक्ट्स व्यवहार के मुकाबले अधिक संरचना के साथ गूंगा प्रकार के रूप में व्यवहार करना है। हम पहले से ही जानते हैं कि डब्ल्यूसीएफ डाटाकंट्रैक्ट्स, एएसपी.नेट एमवीसी व्यू, विंडोज फॉर्म कंट्रोल इत्यादि के लिए यह सही काम है, इसलिए यह समस्या का एक प्रसिद्ध समाधान होगा।

जैसे कि हमारे पास यूआई में दृश्यों को पॉप्युलेट करने के लिए नियंत्रक हैं, हमारे पास सेवा संचालन, मैपर और डोमेन ऑब्जेक्ट्स के लिए डीटीओ मानचित्र नहीं हो सकता है। दूसरे शब्दों में, आपका सबसे अच्छा सहारा फू को क्रमबद्ध करने का प्रयास नहीं करना होगा।

इसके बजाय, FooJson कक्षा को परिभाषित करें जो फू की स्थिर संरचना का प्रतिनिधित्व करता है और दोनों के बीच अनुवाद करने के लिए मैपर का उपयोग करता है।