我在哪里放置接口及其实现?

时间:2013-09-26 02:43:12

标签: c# asp.net-mvc-4 nhibernate onion-architecture

我上面的每个插图都有项目布局。 enter image description here

我想用一个接口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时,将根据发生的情况提交或回滚事务。

这一切都有效,除了我不知道在哪里存储接口和实现。它不应该留在基础设施中,因为服务层依赖于它,它是上面的一层。 (根据洋葱标准,这很糟糕。)

我无法将接口放在Core中,因为我需要依赖Nhibernate .. 所以不知道这到底要做什么。我正在考虑制作一个公共/共享层并让它充当中间人,不确定这是否是正确的方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果我的域服务界面如下:

IWidgetService.MakeWidget(MakeWidgetParameters)

我的实现将打开一个ISession并完成制作和持久化我想要的更改的工作。通过这种方式,ISession不会泄漏到外层。