Ich versuche, UnitOfWork und Repository-Muster mit NHibernate zu implementieren. Ich bin auf der Suche nach der besten Möglichkeit, Sitzung zwischen Einheit der Arbeit und Repository-Instanz zu teilen.Teilen einer NHibernate-Sitzung zwischen UnitOfWork und Repository
Der offensichtlichste Weg ist ThreadStatic
Eigenschaften in UnitOfWork
Klasse
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
}
Und dann in Repository
Klasse vorstellen:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected ISession Session { get { return UnitOfWork.Current.Session; } }
//other code
}
Allerdings möchte ich Implementierung oben und beschlossen aufgeführt nicht zu finde einen anderen Weg, das Gleiche zu tun. So
Ich kam mit dem zweiten Weg:
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!");
}
}
wo ISessionFactory
Singleton von Autofac aufgelöst wird und CurrentSessionContext
CallSessionContext
ist. Dann injiziere ich ICurrentSessionProvider
in Konstruktoren UnitOfWork
und Repository
Klassen und verwenden Sie CurrentSession
Eigenschaft, Sitzungen zu teilen.
Beide Ansätze scheinen gut zu funktionieren. Ich frage mich also, gibt es andere Möglichkeiten, dies zu implementieren? Was ist die beste Vorgehensweise beim Teilen der Sitzung zwischen Arbeitseinheit und Repository?
Ich hoffe, Sie könnten ein Codebeispiel für die Einstellung dieser bestimmten Architektur bereitstellen! – adaam
Hey, ich bin gerade in Eile, aber vielleicht hilft dir das folgende, sehr vereinfachte Beispiel (ich werde sehen, ob ich es später aktualisieren kann): https://gist.github.com/anonymous/ ebd36d4a39c2ed45dd20824d849f89f7 –