0

根据上面的插图,我有项目布局。在此处输入图像描述

我想编写一个带有接口 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 .. 所以不知道到底该怎么做。我正在考虑制作一个公共/共享层并让它充当中间人,但不确定这是处理事情的正确方法。

任何帮助将不胜感激。

4

1 回答 1

1

在洋葱架构中,外层实现接口。

我的建议:设计您的域服务接口,以便在您的应用程序中使用它们。在您的域服务实现中使用您的 ISessionManager。由于您的实现位于外层,因此您对 ISessionManager(以及因此 NHibernate)的依赖也在您的外层。

就我而言,我倾向于在 NHibernate 上使用通用存储库,但该决定仍然是我的域服务的实现细节。

如果我的域服务接口如下所示:

IWidgetService.MakeWidget(MakeWidgetParameters)

我的实现将打开一个 ISession 并完成我想要对 Db 进行的更改和持久化的工作。这样,ISession 就不会泄漏到外层。

于 2013-09-26T22:53:51.673 回答