使用工作单元/存储库模式构建了一个小型应用程序后,我很难理解如何在我的业务层中正确使用它。我的应用程序有一个数据访问层,它可以是 NHibernate 或实体框架。我可以轻松地在这些之间切换。
我有许多存储库,例如 Customer、Order 等。我的工作单元将是 ISession 或 Object Context,具体取决于我要测试的 DAL。
我的业务层包含一个业务方法 - CreateOrder()。我正在努力理解的是我应该在业务层的哪个位置初始化我的工作单元和我的存储库。
专注于 Nhibernate,我的 DAL 看起来像:
public class NHibernateDAL : IUnitOfWork
{
log4net.ILog log = log4net.LogManager.GetLogger(typeof(NHibernateDAL));
ISession context;
public NHibernateDAL()
{
context = SessionProvider.OpenSession();
this.Context.BeginTransaction();
CurrentSessionContext.Bind(context);
}
public ISession Context
{
get { return context; }
}
public void Commit()
{
this.Context.Transaction.Commit();
context.Close();
}
public void Dispose()
{
ISession session = CurrentSessionContext.Unbind(SessionProvider.SessionFactory);
session.Close();
}
}
在我的业务层中,我想知道我应该在哪里声明我的工作单元和存储库。它们是在类级别还是在 CreateOrder 方法中声明的?
例如:
public class BusinessLogic
{
UnitOfWork _unitOfWork = new UnitOfWork(NHibernateDAL);
NhRepository<Order> _orderRepository = new NhRepository<Order>(_unitOfWork);
NhRepository<Customer> _customerRepository = new NhRepository<Customer>(_unitOfWork);
....
public void CreateOrder(.....)
{
Order order = new Order();
_orderRepository.Add(order);
_unitOfWork.Commit();
}
}
上述代码仅适用于第一次调用 CreateOrder() 方法,但不适用于后续调用,因为会话已关闭。我尝试在提交事务后删除“context.Close()”调用,但这也失败了。尽管上述方法不起作用,但在此范围内声明我的存储库和工作单元对我来说似乎更正确。
但是,如果我按如下方式实现它,它可以正常工作,但是在方法本身的范围内声明存储库和工作单元似乎是不自然的。如果我有大量的业务方法,那么我将在各处声明存储库和工作单元:
public class BusinessLogic
{
public void CreateOrder(.....)
{
UnitOfWork _unitOfWork = new UnitOfWork(NHibernateDAL);
var _orderRepository = new NhRepository<Order>(_unitOfWork);
NhRepository<Customer> _customerRepository = null;
Order order = new Order();
_orderRepository.Add(order);
_unitOfWork.Commit();
}
}
如果我要使用类级别声明来实现这一点,那么我认为我需要一些方法来在 CreateOrder 方法的开头重新打开相同的工作单元。
在业务层中使用工作单元和存储库的正确方法是什么?