我上面的每个插图都有项目布局。
我想用一个接口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 .. 所以不知道这到底要做什么。我正在考虑制作一个公共/共享层并让它充当中间人,不确定这是否是正确的方法。
非常感谢任何帮助。
答案 0 :(得分:1)
在洋葱架构中,外层实现接口。
我的建议:设计您的域服务接口,以便在您的应用程序中使用它们。在域服务实现中使用您的ISessionManager。由于您的实现位于外层,因此您对ISessionManager(以及NHibernate)的依赖也在您的外层。
就我而言,我倾向于使用NHibernate上的通用存储库,但该决定仍然是我的域服务的实现细节。
如果我的域服务界面如下:
IWidgetService.MakeWidget(MakeWidgetParameters)
我的实现将打开一个ISession并完成制作和持久化我想要的更改的工作。通过这种方式,ISession不会泄漏到外层。