作業単位パターンに関するアドバイスを探しています。
作業単位のコミットが複数回呼び出されたのか、それとも 1 回だけ呼び出された後、ガベージ コレクションのためにオブジェクトを残したのか?
作業単位プレイを注入するのは良い考えですか、それともオブジェクトに作業を実行するように依頼するときにメソッド呼び出しで渡す必要がありますか?
作業単位パターンに関するアドバイスを探しています。
作業単位のコミットが複数回呼び出されたのか、それとも 1 回だけ呼び出された後、ガベージ コレクションのためにオブジェクトを残したのか?
作業単位プレイを注入するのは良い考えですか、それともオブジェクトに作業を実行するように依頼するときにメソッド呼び出しで渡す必要がありますか?
作業単位パターンを実装する型のインスタンスには、通常、その有効期間を制御する必要がある単一の所有者がいます。Commit
、Open
、Close
、 などのメソッドは、Dispose
多くの場合、型を明示的に制御する (または、適切な場合は抽象化の背後に配置する) 必要があることを示す強力なシグナルです。
このため、作業単位インスタンス自体を注入するのではなく、そのような作業単位を作成する方法を知っているタイプ (ファクトリ) を注入することをお勧めします。
その場合の作業単位はコンテキストとして機能し、他のオブジェクトが同じコンテキストで操作を実行する必要がある場合 (たとえば操作をアトミックに保つため)、それを渡す必要があります。これは次のようになります。
public class MyCommand
{
private readonly IUnitOfWorkFactory factory;
public MyCommand(IUnitOfWorkFactory factory)
{
this.factory = factory;
}
public void Execute()
{
using (var context = this.factory.CreateNew())
{
this.DoSomeNiceThings(context);
context.Commit();
}
}
}
多くの DI フレームワークは、オブジェクトとその依存関係が実行されるコンテキストを定義する可能性を提供します。これにより、作業単位自体を注入し、その同じインスタンスをすべての依存関係に注入できます。これは非常に便利な機能ですが、コードの正確性は作業単位のスコープを構成する方法に依存するため、この特定のシナリオでは実行しません。これにより、コードは非常に暗黙的になり、従うのが難しく、壊れやすくなります。IMO のような機能は、消費者が依存関係を気にしないシナリオで特に役立ちます。したがって、この機能は、パフォーマンスの最適化、キャッシュ戦略の実装などに非常に役立ちます。
作業単位のコミットが複数回呼び出されたのか、それとも 1 回だけ呼び出された後、ガベージ コレクションのためにオブジェクトを残したのか?
複数回の呼び出しCommit
が有効なシナリオであるかどうかは、設計方法によって異なります。私の実稼働アプリケーションでは、トランザクション内で作業単位を実行することがよくあります。これにより、ビジネス操作をアトミックに保ちながら、操作をデータベースにコミットできます (たとえば、データベースで生成されたキーを取得するため)。
これが役立つことを願っています。
作業単位の背後にある考え方は、単一のメソッド内のアクションから要求されたすべての変更などの「作業単位」をカプセル化することです (例: 特定のロールを持つユーザーを追加すると、ユーザーが追加され、ユーザーに関連付けられたロールが追加されます)。 .
作業単位を使用してこれらの変更を「バッチ処理」し、それらを一度に実行します (通常はトランザクションを介して - 異なるアクションが 1 つの作業単位を構成するため、1 つが失敗した場合はすべて実行する必要があります)。
実際には、commit は作業単位ごとに 1 回だけ呼び出します。エンティティ フレームワーク/nhibernate のようなほとんどの ORM では、単一の作業単位を介して複数のコミットを実行できます。各コミットは、作業単位を表す特定のトランザクションに関連付けられています。