根据上面的插图,我有项目布局。
我想编写一个带有接口 ISessionManager 的“SesisonManager”,使用我的容器将其连接起来并将其注入我的服务层。UI 和基础设施层是最外层,此时只有核心作为依赖项,据我所知,这是正确的方法。
我的 SessionManager 看起来像这样。
public interface ISessionManager:IDisposable
{
ISession GetSession();
}
public class SessionManager : ISessionManager
{
private readonly ISessionFactory _sessionFactory;
private readonly ILogger _logger;
private ITransaction _transaction;
private ISession _session;
public SessionManager(ISessionFactory sessionFactory,ILogger logger)
{
_sessionFactory = sessionFactory;
_logger = logger;
}
public void Dispose()
{
try
{
if (_session == null) return;
if (_transaction == null || !_transaction.IsActive) return;
_transaction.Commit();
_transaction.Dispose();
}
catch (Exception exception)
{
if (_transaction != null)
{
_transaction.Rollback();
_transaction.Dispose();
}
_logger.Error("Something bad just happend");
}
finally
{
if (_session != null) _session.Dispose();
}
}
public ISession GetSession()
{
if (CurrentSessionContext.HasBind(_sessionFactory))
{
_session = CurrentSessionContext.Unbind(_sessionFactory);
}
else
{
_session = _sessionFactory.OpenSession();
CurrentSessionContext.Bind(_session);
}
// Let's make sure we have a transaction
_transaction = _session.BeginTransaction(IsolationLevel.ReadCommitted);
return _session;
}
}
这将通过构造函数注入到服务中,当我需要 ISession 时,我只需调用 GetSession。当 SessionManager 被释放时,事务将被提交或回滚,具体取决于发生的情况。
这一切都有效,除了我不知道在哪里存储接口和实现。它不应该留在基础设施中,因为服务层依赖于它并且它是上面的一层。(根据洋葱标准,这很糟糕)。
我不能将接口放在核心中,因为我需要依赖于 Nhibernate .. 所以不知道到底该怎么做。我正在考虑制作一个公共/共享层并让它充当中间人,但不确定这是处理事情的正确方法。
任何帮助将不胜感激。