जो मैंने समाप्त किया वह पाब्लो के उत्तर के साथ रिपोजिटरी पैटर्न का संयोजन था। इसका अर्थ यह है कि मेरे ईएफ मॉडल संस्करणित हैं, मैं मॉडलों के नए संस्करणों में डेटाबेस माइग्रेट करने के लिए ईएफ कोड-प्रथम माइग्रेशन का उपयोग करता हूं, मेरा 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 में माइग्रेट किया गया है।