私は以前、この状況を 2 つの方法で切り離しました: ステータス変更とログ イベントです。
最初の方法は、次のような IHaveStatus インターフェイスを作成することです。
/// <summary>
/// Interface for objects that have a status message
/// that describes their current state.
/// </summary>
public interface IHaveStatus
{
/// <summary>
/// Occurs when the <seealso cref="Status"/> property has changed.
/// </summary>
event EventHandler<StatusChangedEventArgs> StatusChanged;
/// <summary>
/// The current status of the object. When this changes,
/// <seealso cref="StatusChanged"/> fires.
/// </summary>
string Status { get; }
}
オブジェクトが処理を行うとき、Status プロパティを設定します。設定時に StatusChanged イベントを発生させるようにプロパティ セッターを構成できます。オブジェクトを使用する人は誰でも、ステータス変更イベントをリッスンし、発生したすべてをログに記録できます。
これの別のバージョンは、ログ イベントをオブジェクトに追加することです。
public event EventHandler<LogEventArgs> Log;
プリンシパルはほとんど同じですが、オブジェクトだけがステータス駆動型ログよりもおしゃべりが少なくなります (特に何かをログに記録したい場合にのみイベントを発生させます)。
これらのイベントを適切なログ (できれば DI を使用して設定) に接続するのは、DAL の外部の呼び出し元の責任であるという考えです。DAL は、これらのイベントを誰が、または何が消費しているのかを認識しないため、これらの懸念がうまく分離されます。