2013-02-13 21 views
5

के साथ एपीआई वर्जनिंग मैं एएसपी.नेट वेब एपीआई, कोड-फर्स्ट एंटिटी फ्रेमवर्क 5 और एसक्यूएल सर्वर 2012 का उपयोग कर एक आरईएसटी एपीआई विकसित कर रहा हूं और मुझे एपीआई संस्करण में सक्षम होना चाहिए। मैंने यूआरआई में या कस्टम HTTP शीर्षलेख में एपीआई संस्करण को इंगित करने और संकेतित संस्करण के आधार पर विभिन्न एपीकंट्रोलर का चयन करने के लिए कस्टम IHttpControllerSelector का उपयोग करने के बारे में कुछ ब्लॉग पोस्ट और आलेख पढ़े हैं। यह सब समझ में आता है।एएसपी.नेट वेब एपीआई और एंटिटी फ्रेमवर्क

मैं यह समझने के लिए संघर्ष कर रहा हूं कि वेब एपीआई परत से परे वर्जनिंग के प्रभावों का प्रबंधन कैसे करें, खासकर एंटिटी फ्रेमवर्क में। मैं एपीआई के पुराने संस्करणों को तोड़ने के बिना अपने डीबीकॉन्टेक्स्ट को विकसित करने के बारे में कैसे जा सकता हूं? क्या मैं डीबीकॉन्टेक्स्ट संस्करण भी कर सकता हूं? और यदि हां, तो कैसे?

उत्तर

3

जो मैंने समाप्त किया वह पाब्लो के उत्तर के साथ रिपोजिटरी पैटर्न का संयोजन था। इसका अर्थ यह है कि मेरे ईएफ मॉडल संस्करणित हैं, मैं मॉडलों के नए संस्करणों में डेटाबेस माइग्रेट करने के लिए ईएफ कोड-प्रथम माइग्रेशन का उपयोग करता हूं, मेरा DbContext हमेशा मॉडल के नवीनतम संस्करण के साथ काम करता है, मैंने कई ठोस भंडार विकसित किए कि प्रत्येक नीचे IRepository<TItem> इंटरफ़ेस को लागू करता है। IRepository<TItem> की

public interface IRepository<TItem> : IQueryable<TItem>, ICollection<TItem>, IDisposable 
    where TItem : class 
{ 
    void Update(TItem item); 
    void SaveChanges(); 
} 

एक कार्यान्वयन DbRepository<TItem> जो इकाई की रूपरेखा डेटाबेस के लिए बात करने के लिए इस्तेमाल किया कोड लपेटता है।

public class DbRepository<TItem> : IRepository<TItem> 
    where TItem : class 
{ 
    private MyDbContext _db; 

    public DbRepository() 
    { 
     _db = new MyDbContext(); 
    } 

    // Implementation of IRepository<TItem> methods 
} 

IRepository<TItem> का एक और कार्यान्वयन TypeConversionRepository<TExternal,TInternal> जो एक अमूर्त वर्ग है कि एक मॉडल प्रकार से दूसरे में परिवर्तित करने की सुविधा है।

public abstract class TypeConversionRepository<TExternal, TInternal> : IRepository<TExternal> 
    where TExternal : class 
    where TInternal : class 
{ 
    protected IRepository<TInternal> InternalRepository { get; set; } 

    protected abstract TInternal ConvertInbound(TExternal externalItem); 

    protected abstract TExternal ConvertOutbound(TInternal internalItem); 

    // Implementation of IRepository<TItem> methods 
} 

तरीके कि मॉडल वापसी या मॉडलों को स्वीकार के रूप में मानकों ConvertInbound() और ConvertOutbound() का उपयोग TInternal और इसके विपरीत प्रकार TExternal के मॉडल कन्वर्ट करने के लिए। इसलिए, MyModel के निम्नलिखित 2 संस्करण दिए गए हैं, हम MyModelRepository के 2 संस्करण लिख सकते हैं; जबकि संस्करण 1 संस्करण 2 से वापस संस्करण 1.

namespace Models.v1 
{ 
    public class MyModel 
    { 
     public int Id { get; set; } 
     public string MyProperty { get; set; } 
    } 

    public class MyModelRepository : TypeConversionRepository<Models.v1.MyModel,Models.v2.MyModel> 
    { 
     MyModelRepository() 
     { 
      this.InternalRepository = new Models.v2.MyModelRepository(); 
     } 

     protected override TInternal ConvertInbound(TExternal externalItem) 
     { 
      return new Models.v2.MyModel 
      { 
       Id = externalItem.Id, 
       MyNewProperty = externalItem.MyProperty 
      }; 
     } 

     protected override TExternal ConvertOutbound(TInternal internalItem) 
     { 
      return new Models.v1.MyModel 
      { 
       Id = internalItem.Id, 
       MyProperty = internalItem.MyNewProperty 
      }; 
     } 
    } 
} 

namespace Models.v2 
{ 
    public class MyModel 
    { 
     public int Id { get; set; } 
     public string MyNewProperty { get; set; } 
    } 

    public class MyModelRepository : DbRepository<MyModel> 
    { 

    } 
} 

कन्वर्ट करने के लिए अब v1 ApiController v1 MyModelRepository उपयोग कर सकते हैं, वी 2 ApiController v2 MyModelRepository उपयोग कर सकते हैं की आवश्यकता होगी संस्करण 2 डेटाबेस से सीधे बात कर सकते हैं, लेकिन अंत में सभी अनुरोध डेटाबेस का उपयोग करते हैं जिसे v2 में माइग्रेट किया गया है।

1

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

सम्मान, पाब्लो।

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