के बीच एक एनएचबीर्नेट सत्र साझा करना मैं एनएचबेर्नेट के साथ यूनिटऑफवर्क और रिपोजिटरी पैटर्न को कार्यान्वित करने की कोशिश कर रहा हूं। मैं कार्य उदाहरण और भंडार उदाहरण की इकाई के बीच सत्र साझा करने का सबसे अच्छा तरीका ढूंढ रहा हूं।यूनिटऑफवर्क और रिपोजिटरी
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected ISession Session { get { return UnitOfWork.Current.Session; } }
//other code
}
हालांकि मैं उपरोक्त और करने का फैसला किया कार्यान्वयन पसंद नहीं आया:
सबसे स्पष्ट रास्ताRepository
कक्षा में UnitOfWork
कक्षा में ThreadStatic
गुण पेश करने
public class UnitOfWork : IUnitOfWork
{
public static UnitOfWork Current
{
get { return _current; }
set { _current = value; }
}
[ThreadStatic]
private static UnitOfWork _current;
public ISession Session { get; private set; }
//other code
}
और फिर है ऐसा करने के लिए एक और तरीका खोजें।
तो मैं दूसरा तरीका साथ आया:
public interface ICurrentSessionProvider : IDisposable
{
ISession CurrentSession { get; }
ISession OpenSession();
void ReleaseSession();
}
public class CurrentSessionProvider : ICurrentSessionProvider
{
private readonly ISessionFactory _sessionFactory;
public CurrentSessionProvider(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
}
public ISession OpenSession()
{
var session = _sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
return session;
}
public void Dispose()
{
CurrentSessionContext.Unbind(_sessionFactory);
}
public ISession CurrentSession
{
get
{
if (!CurrentSessionContext.HasBind(_sessionFactory))
{
OnContextualSessionIsNotFound();
}
var contextualSession = _sessionFactory.GetCurrentSession();
if (contextualSession == null)
{
OnContextualSessionIsNotFound();
}
return contextualSession;
}
}
private static void OnContextualSessionIsNotFound()
{
throw new InvalidOperationException("Session is not opened!");
}
}
जहां ISessionFactory
सिंगलटन autofac द्वारा हल हो गई है और CurrentSessionContext
CallSessionContext
है। फिर मैं UnitOfWork
और Repository
कक्षाओं के रचनाकारों में ICurrentSessionProvider
इंजेक्ट करता हूं और सत्र साझा करने के लिए CurrentSession
संपत्ति का उपयोग करता हूं।
दोनों दृष्टिकोण ठीक काम कर रहे प्रतीत होते हैं। तो मुझे आश्चर्य है कि इसे लागू करने के अन्य तरीके हैं? काम और भंडार की इकाई के बीच सत्र साझा करने में सबसे अच्छा अभ्यास क्या है?
उम्मीद कर रहा था कि आप इस विशेष आर्किटेक्चर को स्थापित करने के लिए कोड नमूना प्रदान कर सकते हैं! – adaam
अरे, मैं अभी जल्दी में हूं, लेकिन हो सकता है कि निम्नलिखित बहुत ही सरल नमूना आपको प्रारंभ करने में मदद कर सकें (देखेंगे कि मैं इसे बाद में अपडेट कर सकता हूं): https://gist.github.com/anonymous/ ebd36d4a39c2ed45dd20824d849f89f7 –