मुझे आश्चर्य है कि मेरी सेवा परत को मेरे भंडार के बारे में कितना पता होना चाहिए? पिछले प्रोजेक्ट में मैंने हमेशा सूचियां लौटाईं और मुझे आवश्यक प्रत्येक चीज़ के लिए एक विधि थी।NHibernate के साथ रिपोजिटरी पैटर्न?
तो अगर मुझे उन सभी पंक्तियों को वापस करने की आवश्यकता है जिनमें 5 का आईडी था जो एक विधि होगी। मेरे पास बनाने, अद्यतन करने, हटाने और अन्य NHibernate विकल्पों के लिए सामान्य भंडार है लेकिन पूछताछ के लिए मैं नहीं करता हूं।
अब मैं अधिक IQueryable का उपयोग शुरू कर रहा हूं क्योंकि मैंने प्रत्येक मामले के लिए कई विधियों की समस्याओं में भागना शुरू कर दिया है।
कहें कि मुझे उन सभी को वापस करने की आवश्यकता है जिनके पास एक निश्चित आईडी था और 3 टेबल की आवश्यकता है जहां उत्सुकता से यह एक नई विधि होगी। अगर मुझे एक निश्चित आईडी की आवश्यकता है और कोई उत्सुक लोडिंग नहीं है जो एक अलग विधि होगी।
तो अब मैं सोच रहा हूं कि मैं कहां से क्लॉज भाग करता हूं और IQueryable लौटाता हूं तो मैं परिणाम जोड़ सकता हूं (यानी अगर मुझे उत्सुक लोडिंग करने की आवश्यकता है)।
एक ही समय में यह सेवा परत को रिपोजिटरी परत के बारे में अधिक जागरूक बनाता है और अब मैं रिपोजिटरी को जितना आसान नहीं कर सकता उतना आसान है क्योंकि अब सेवा परत में विशिष्ट एनएचबेर्नेट है।
मैं भी यकीन नहीं है कि कैसे मजाक प्रभाव होता हूँ।
तो अब मैं सोच रहा हूं कि अगर मैं इस मार्ग से नीचे जाता हूं तो अगर रिपोजिटरी की आवश्यकता होती है क्योंकि ऐसा लगता है कि वे एक साथ मिश्रित हैं।
संपादित
अगर मैं अपने भंडार से छुटकारा पाने और सिर्फ मेरी सेवा परत में सत्र है वहाँ तो काम वर्ग की एक इकाई होने के लिए एक बिंदु है?
public class UnitOfWork : IUnitOfWork, IDisposable
{
private ITransaction transaction;
private readonly ISession session;
public UnitOfWork(ISession session)
{
this.session = session;
session.FlushMode = FlushMode.Auto;
}
/// <summary>
/// Starts a transaction with the database. Uses IsolationLevel.ReadCommitted
/// </summary>
public void BeginTransaction()
{
transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
}
/// <summary>
/// starts a transaction with the database.
/// </summary>
/// <param name="level">IsolationLevel the transaction should run in.</param>
public void BeginTransaction(IsolationLevel level)
{
transaction = session.BeginTransaction(level);
}
private bool IsTransactionActive()
{
return transaction.IsActive;
}
/// <summary>
/// Commits the transaction and writes to the database.
/// </summary>
public void Commit()
{
// make sure a transaction was started before we try to commit.
if (!IsTransactionActive())
{
throw new InvalidOperationException("Oops! We don't have an active transaction. Did a rollback occur before this commit was triggered: "
+ transaction.WasRolledBack + " did a commit happen before this commit: " + transaction.WasCommitted);
}
transaction.Commit();
}
/// <summary>
/// Rollback any writes to the databases.
/// </summary>
public void Rollback()
{
if (IsTransactionActive())
{
transaction.Rollback();
}
}
public void Dispose() // don't know where to call this to see if it will solve my problem
{
if (session.IsOpen)
{
session.Close();
}
}
मैं इसमें और अधिक देखूंगा। मुझे जो चीज मिलती है वह मुझे यह विचार पसंद है कि सर्विस लेयर डेटाबेस के बारे में कुछ भी नहीं जानता है जिससे यूनिट टेस्ट (यदि मुझे कभी आवश्यकता हो) और ओआरएम को स्विच करना आसान हो जाता है। आप इन परिदृश्यों को कैसे संभालेंगे? – chobo2
मैं यह भी सोच रहा हूं कि क्या मैं रिपॉजिटरीज़ से छुटकारा पाता हूं तो क्या वर्क क्लास की मेरी इकाई का एक बिंदु है? देखें – chobo2
आप सत्र को लपेटने के लिए यूनिटऑफवर्क का उपयोग कर सकते हैं, या यहां तक कि एनएच सत्र का भी उपयोग कर सकते हैं। यूनिट परीक्षण के लिए, आप इकाई परीक्षण ** के लिए ** इन-मेमोरी डेटाबेस का उपयोग कर सकते हैं ** ** NHiberate के साथ। http://ayende.com/blog/3983/nhibernate-unit-testing –