Ранее я развязывал эту ситуацию двумя способами: изменения статуса и запись событий.
Первый способ - создать интерфейс 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;
Принцип почти такой же, только ваши объекты будут менее болтливыми, чем журнал, управляемый Статусом (вы запускаете событие, только когда вы специально хотите что-то зарегистрировать).
Идея заключается в том, что вызывающие абоненты вне вашего DAL обязаны подключать эти события к надлежащему журналу (надеюсь, установленному с помощью DI). Ваш DAL не замечает, кто или что потребляет эти события, что хорошо разделяет эти проблемы.