これはより概念的な質問です。私は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 を追加したいと考えています。問題は、イベント バブリングをトランザクションと統合することです。サービス層..次に、サービス層がこのイベントを処理し、クライアントにイベントを発行します..しかし、トランザクションがコミットされたことを確認する前に、これらのイベントを発行したくありません。BL レイヤーは私のビジネス トランザクション ロジックを認識していないため、CreatePerson メソッドでイベントを発生させます。
トランザクションを完了した後でのみ、サブスクライブしたイベントをスタック/処理するための設計ソリューションはありますか?
私の質問を簡単にするために: コミット後にのみ HandlePersonChanged を一括で実行したい..