工作单元肯定是要走的路。如果您将SQL Server与本地数据库一起使用,TransactionScope
将为您执行大部分繁重的工作;只要你在仓库之间共享会话(你正在通过构造器注入进行操作,那么......),那么你可以将它们嵌套到你的内心。默认情况下,它会在“环境”事务中使用(如果有的话),如果没有,则会启动一个新的事务,这与您想要的工作单元的行为完全相同。
所以你的仓库可能是这样的:
public class UserRepository : IUserRepository
{
public UserRepository(ISession session)
{
this.Session = session;
}
public void Save(User user)
{
using (TransactionScope tsc = new TransactionScope())
{
Session.Save(user);
tsc.Complete();
}
}
protected ISession Session { get; set; }
}
public class OrderRepository : IOrderRepository
{
public OrderRepository(ISession session)
{
this.Session = session;
}
public void Save(Order order)
{
using (TransactionScope tsc = new TransactionScope())
{
Session.Save(order);
tsc.Complete();
}
}
protected ISession Session { get; set; }
}
然后你就可以像这样从事的工作完成单位:
User currentUser = GetCurrentUser();
using (TransactionScope tsc = new TransactionScope())
{
ISession session = SessionFactory.OpenSession();
Order order = new Order(...);
order.User = currentUser;
IOrderRepository orderRepository = GetOrderRepository(session);
orderRepository.Save(order);
currentUser.LastOrderDate = DateTime.Now;
IUserRepository userRepository = GetUserRepository(session);
userRepository.Save(currentUser);
tsc.Complete();
}
如果你不喜欢TransactionScope
或不允许您从有效使用它,那么你可以始终实现自己的UOW或使用现有的实现。或者,如果你只是一个建筑奇怪的怪物,那么你可以同时使用 - 使用一个通用的工作单元接口与一个主要的DI库,并使用TransactionScope
实现具体的UOW。
这是一个工作模式单元的例子吗? – 2010-01-11 23:47:57
'TransactionScope'从根本上说是一个UOW实现,所以是的;如果你想要一个“真正的”UOW,那么你应该使用一个接口来代替工厂或者IoC容器,并且在一个实现中包装'TransactionScope'。但是如果你的目标将永远是SQL Server,那么'TransactionScope'本身通常就够用了。 – Aaronaught 2010-01-12 00:45:34
工作单元看起来像是我所称的服务的同义词,所以我不明白为什么它是过度的,UOW不是。有人可以解释它是如何根本不同的?不要将“服务”与“Web服务”或WSDL混淆。 – duffymo 2010-01-12 01:45:54