我读过工作单位模式和大量的MVC/EF单位工作实例,但是我想要做的是将多个工作单元封装到一个大集合中。也许这个模式已经存在于某个地方,但我不知道它是否存在。
为了保持EF DbContexts的干净,我已经将它们分解成不同的域,但是有时这些域是重叠的。我还需要做非db类型的单位(如保存文件到HD,并在回滚删除)。我不知道这是否有不同的模式,但我想做的事情如下:
// very rough idea
public class UnitOfWork
{
public UnitOfWork(Func<bool> work, Action commit)
{
_work = work;
_commit = commit;
}
public Func<bool> _work;
public Action _commit;
public bool HasExecuted { get; set; }
public bool IsSuccessful { get; set; }
public Exception Exception { get; set; }
public bool Work()
{
try
{
HasExecuted = true;
IsSuccessful = _work();
}
catch(Exception ex)
{
Exception = ex;
}
return IsSuccessful;
}
public
}
// very rough idea
public class TransactionWork
{
private List<UnitOfWork> _uofs = new List<UnitOfWork>();
public void Add(UnitOfWork uof)
{
_oufs.Add(uof);
}
public bool Commit()
{
var result = true;
var exceptions = new List<Exception>();
foreach(var uof in _uofs)
{
result = result && uof.Work();
if (uof.Exception != null)
{
exceptions.Add(uof.Exception);
}
}
if (result)
{
foreach(var uof in _uofs)
{
uof.Commit();
}
}
else if (exceptions.Count > 0)
{
throw new AggregateException(exceptions);
}
return result;
}
}
// Transaction would be a custom object I create to encapsulate
// multiple UoW.
var transactionWork = New TransactionWork();
transactionWork.Add(uof1);
transactionWork.Add(uof2);
var result = transactionWork.Commit();如果任何uof的提交失败,所有这些都将被回滚。
我很好奇是否有这样的模式,或者我没有想到的任何类型的改进等等。
发布于 2016-02-22 22:33:40
工作单元模式的一个相当简单的扩展就是创建一个包含提交和回滚方法的接口(可能称为ITransactionItem )。然后,您可以让您的每个工作单元对象实现它,以及执行相关功能的任何对象,比如您的文件操作。然后,一个新的顶级工作单元将保存这些单元的列表,并酌情提交/回滚。这似乎与您要使用发布的代码的位置类似。
但是,需要考虑的是,如果在提交阶段发生故障,任何已经提交的事务都不能回滚。如果您有多个无法共享事务的工作单元(例如,因为它们不使用相同的数据库),则需要了解事务的潜在后果。如果后果是不可接受的,则需要切换到两阶段提交协议。
https://softwareengineering.stackexchange.com/questions/310799
复制相似问题