gpt4 book ai didi

.net - 为什么在 Dispose() 方法中隐式提交工作单元不好?

转载 作者:行者123 更新时间:2023-12-02 15:44:11 24 4
gpt4 key购买 nike

我编写了一个 UnitOfWork 实现,它不公开公共(public) Commit() 方法。相反,UnitOfWork 实现了 IDisposable 并在 Dispose() 方法中执行 Commit。我认为这没有任何直接问题,但它似乎不正统,所以我想知道你们是否可以指出一些我忽略的不这样做的主要原因。

这里是一些示例代码:

public class DataService
{
public DataService()
{
_db = new MyDataContext();
_exceptionHandler = new SqlExceptionHandler();
}
private readonly MyDataContext _db;
private readonly SqlExceptionHandler _exceptionHandler;
public void Add(Product product, Cart cart)
{
using(UnitOfWork unitOfWork = new UnitOfWork(_db, ex=>_exceptionHandler.Handle(ex)))
{
unitOfWork.Create<CartItem>(new CartItem{CartId = cart.Id, ProductId = product.Id});
unitOfWork.Update<Product>(x => x.Id == product.Id, product => { product.OrderCount++; });
}
}
}


public class UnitOfWork : IDisposable
{
private readonly DataContext _dataContext;
private readonly Func<Exception, bool> _handleException;
private bool _dirty;

public UnitOfWork(DataContext dataContext, Func<Exception,bool> handleException)
{
_dataContext = dataContext;
_handleException = handleException;
}

private Table<T> Table<T>()
where T: class
{
return _dataContext.GetTable<T>();
}
private T[] Find<T>(Expression<Func<T,bool>> select)
where T: class
{
return Table<T>().Where(select).ToArray();
}

public void Create<T>(T persistentObject)
where T: class
{
Table<T>().InsertOnSubmit(persistentObject);
_dirty = true;
}
public void Update<T>(Expression<Func<T, bool>> select, Action<T> update)
where T : class
{
var items = Find<T>(select);
if (items.Length > 0)
{
foreach (var target in items) update(target);
_dirty = true;
}
}
public void Delete<T>(Expression<Func<T, bool>> select)
where T : class
{
var items = Find<T>(select);
switch (items.Length)
{
case 0: return;
case 1:
Table<T>().DeleteOnSubmit(items[0]);
break;
default:
Table<T>().DeleteAllOnSubmit(items);
break;
}
_dirty = true;
}

public void Dispose()
{
if (_dirty)
{
Commit(1);
}
}

private void Commit(int attempt)
{
try
{
_dataContext.SubmitChanges();
}
catch (Exception exception)
{
if (attempt == 1 && _handleException != null && _handleException(exception))
{
Commit(2);
}
else
{
throw;
}
}
}
}

最佳答案

因为未处理的异常将提交事务。异常意味着某些事情没有按计划进行 = 不应提交事务。

如果在处置之前未调用 Commit,最好在 DisposeRollback

关于.net - 为什么在 Dispose() 方法中隐式提交工作单元不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5975057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com