ओलिवियर का कार्यान्वयन अच्छा है। यह जेनरिक्स और इंटरफेस का उपयोग करता है जो प्रत्येक इकाई को FillFromDataReader() का अपना कार्यान्वयन देता है।
आप इसे आगे ले जा सकते हैं। सम्मेलन का उपयोग करके सभी डेटा हाइड्रेशन कोड को केंद्रीकृत और समेकित किया जा सकता है।
मुझे लगता है कि आपकी कक्षा संपत्ति के नाम और आपके कॉलम नाम समान हैं। यदि वे नहीं हैं तो संपत्ति कोड में उपनाम विशेषताओं को जोड़ने के लिए निम्न कोड बढ़ाया जा सकता है। कभी-कभी किसी वस्तु की वस्तु में अन्य मूल्यों से गणना की जाती है, इस संपत्ति को हाइड्रेटेड नहीं किया जा सकता है। एक अज्ञात विशेषता निम्न वर्ग में बनाई और कार्यान्वित की जा सकती है।
public class DataAccess
{
/// <summary>
/// Hydrates the collection of the type passes in.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql">The SQL.</param>
/// <param name="connection">The connection.</param>
/// <returns>List{``0}.</returns>
public List<T> List<T>(string sql, string connection) where T: new()
{
List<T> items = new List<T>();
using (SqlCommand command = new SqlCommand(sql, new SqlConnection(connection)))
{
string[] columns = GetColumnsNames<T>();
var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
T item = new T();
foreach (var column in columns)
{
object val = reader.GetValue(reader.GetOrdinal(column));
SetValue(item, val, column);
}
items.Add(item);
}
command.Connection.Close();
}
return items;
}
/// <summary>
/// Sets the value.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="item">The item.</param>
/// <param name="value">The value.</param>
/// <param name="column">The column.</param>
private void SetValue<T>(T item, object value, string column)
{
var property = item.GetType().GetProperty(column);
property.SetValue(item, value, null);
}
/// <summary>
/// Gets the columns names.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns>System.String[][].</returns>
private string[] GetColumnsNames<T>() where T : new()
{
T item = new T();
return (from i in item.GetType().GetProperties()
select i.Name).ToArray();
}
}
उपरोक्त कोड में कुछ चेतावनी हैं। डीबीएनयूल्स और नीलबल प्रकार विशेष मामले हैं और उन्हें निपटने के लिए कस्टम कोड की आवश्यकता होगी। मैं आमतौर पर डीबीएनयूएल को शून्य में परिवर्तित करता हूं। मैंने कभी ऐसे मामले में भाग नहीं लिया है जहां मुझे दोनों के बीच अलग अंतर करने की जरूरत है। नूलल्बे प्रकारों के लिए, बस नलबल प्रकार का पता लगाएं और तदनुसार कोड को संभाल लें।
एक ओआरएम डाटा एक्सेस से निपटने के अधिकांश सिरदर्द को हटा देगा। नकारात्मकता, कई बार आप डीटीओ और डेटाबेस स्कीमा के साथ मिलकर हैं। बेशक इस मुद्दे को abstractions का उपयोग करके निहित किया जा सकता है।कई कंपनियां अभी भी सख्ती से संग्रहित प्रक्रियाओं का उपयोग करती हैं, अधिकतर ओआरएम तब गिर जाते हैं जब उन्हें संग्रहीत प्रक्रियाओं का उपभोग करने के लिए मजबूर किया जाता है। वे सिर्फ संग्रहित प्रक्रियाओं के साथ काम करने के लिए डिज़ाइन नहीं किए गए हैं।
मैंने "Hypersonic" नामक डेटा एक्सेस फ्रेमवर्क लिखा था। यह गिटहब पर है, यह विशेष रूप से संग्रहित प्रक्रियाओं के साथ काम करने के लिए डिज़ाइन किया गया है। उपर्युक्त कोड इसका एक हल्का कार्यान्वयन है।
स्रोत
2013-01-01 19:42:07
यह मूल रूप से एक ओआरएम करता है। ओआरएम का उपयोग क्यों नहीं करें? एंटिटी फ्रेमवर्क बहुत अच्छी तरह से काम करता है, हम इसे एक बड़े LOB एप्लिकेशन में उपयोग कर रहे हैं जिसमें 400+ ग्राहक SAAS एप्लिकेशन चला रहे हैं (औसत 3+ कंप्यूटर प्रत्येक के साथ) और सर्वर पक्ष हमारे सर्वर में होस्ट किया जाता है। –
एक [ValueInjecter] (http://valueinjecter.codeplex.com/) और विशेष रूप से [इस उदाहरण] (http://goo.gl/mD5OG) पर एक नज़र डालें, यह डोमेन ऑब्जेक्ट्स की सूची में डेटा रीडर को मानचित्र करता है जिस तरह से आप इसे करना चाहते हैं। Regardas और नया साल मुबारक हो! – Hugo