这更像是一个概念性问题。 我正在使用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 ..
答案 0 :(得分:0)
我想在提交后在批量中执行HandlePersonChanged。
根据理论,应该在数据发生变化时触发事件。
第二个解决方案:
你可以实现一些队列结构。保存事件直到完成事务。并且在事务完成事件之后,处理队列。
答案 1 :(得分:0)
我最终构建了一个Action Queue,它存储了来自不同组件的事务期间触发的所有事件 然后,在ORM中提交事务(我有一个OnCommit事件)后,队列逐个触发所有存储的事件。当然,如果触发了OnRollback事件,则清除并重新启动Action队列。 此“操作队列”位于基础结构层中,该层在所有层中都是已知的。