这更像是一个概念问题。我正在使用 ORM 编写一个基于事务的服务器-客户端应用程序。基本上这意味着每一层都知道如何使用事务块,例如这里是一个 Web 服务层实现:
public HandleTransaction<TReturn>(Action<TReturn>)
{
bool opendByMe = false;
// Some static transaction manager
var transactionMgr = GetTransactionManager();
try
{
// If not opened before me
if(!transactionMgr.IsActive)
{
transactionMgr.BeginTransaction();
opendByMe = true;
}
// Run the action
var returnValue = action();
// If we opened the transaction then we should close it
if(opendByMe)
{
transactionMgr.Commit();
}
return returnValue;
}
catch
{
if(opendByMe)
{
if(transactionMgr.IsActive)
{
// Rollback only if i opened the transaction
transactionMgr.Rollback();
}
}
// Else, bubble exception
throw;
}
}
public void ServiceWork1()
{
// Subscribe to person event
PersonBL.PersonChanged += HandlePersonChanged(Person pers);
HandleTransaction(() =>
{
// BL actions are made in a bulk.. If one of them fails the transaction
// should be rolled back
PersonBL.CreatePerson("Jeff");
PersonBL.CreatePerson("John");
PersonBL.CreatePerson("Peter");
};)
}
public void HandlePersonChanged(Person pers)
{
// Notify some one
}
这很好用,但现在我想向我的应用程序添加一些事件,即 PersonCreatedEvent。问题是将冒泡事件与事务集成。在上面的示例中,假设 PersonBL.CreatePerson() 方法会触发“PersonChanged”事件服务层..然后服务层处理这个事件并向客户端触发一个事件..但我不想在我确定事务已提交之前触发这些事件。BL 层不知道我的业务事务逻辑,因此它会在 CreatePerson 方法中触发事件。
是否有任何设计解决方案用于仅在我完成事务后堆叠/处理我订阅的事件?
为了简化我的问题:我只想在提交后批量执行 HandlePersonChanged ..