Это в порядке для увольнения событий из Располагает ()?

В моем текущем проекте я использую классы, которые реализуют следующее ITransaction интерфейс, показанный ниже. Это - универсальный интерфейс для транзакции, которая может быть отменена. У меня также есть a TransactionSet класс, который используется для попытки нескольких Транзакций или TransactionSets, и может в конечном счете использоваться для создания дерева транзакций.

Некоторые реализации ITransaction сохраните временные ссылки на экземпляры объектов или файлы, которые это может использовать позже, если существует вызов к Undo(). Успешная транзакция может позже быть подтверждена после который Undo() больше не позволяется и нет таким образом также больше потребность во временных данных. В настоящее время я использую Dispose() как мой метод подтверждения для чистки любых временных ресурсов.

Однако теперь я хотел бы, чтобы мои транзакции также запустили события для уведомления других классов того, что произошло. Я не хочу, чтобы события стреляли, если транзакция не подтверждена. Поскольку я не хочу позволять транзакции запускать события многократно, будучи отмененным и затем работать снова.

Так как я использую Dispose() подтвердить транзакцию - там что-то не так с также увольнением этих событий от него? Или было бы лучше иметь отдельное Confirm() метод в моем интерфейсе, который запускает события в дополнение к Dispose() который очищает временные данные? Я не могу думать ни о каком случае, где я хотел бы подтвердить, но не расположить транзакцию. Все же мне не совсем ясно, в чем я должен и не должен делать Dispose().

public enum TransactionStatus
{
    NotRun, // the Transaction has not been run, or has been undoed back to the original state
    Successful, ///the action has been run and was successful
    Error //there was an attempt to run the action but it failed
}

/// <summary>
/// Generic transaction interface
/// </summary>
public interface ITransaction
{
    TransactionStatus Status { get; }

    /// <summary>
    /// Attempts the transaction returns true if successful, false if failed.
    /// If failed it is expected that everything will be returned to the original state.
    /// Does nothing if status is already Successful
    /// </summary>
    /// <returns></returns>
    bool Go();

    /// <summary>
    /// Reverts the transaction
    /// Only does something if status is successful.
    /// Should return status to NotRun
    /// </summary>
    void Undo();

    /// <summary>
    /// A message describing the cause of the error if Status == Error
    /// Otherwise equal String.Empty
    /// </summary>
    string ErrorMessage { get; }
}
9
задан Eric Anastas 15 July 2010 в 04:12
поделиться

4 ответа

IDisposable - это просто интегрированный во время выполнения шаблон проектирования, который упрощает очистку объекта более эффективным способом, чем финализация. Есть очень мало того, что вы «не можете» сделать с помощью метода утилизации, однако вам следует с осторожностью делать некоторые вещи.

Хотя метод IDisposable.Dispose () не является «настоящим» деструктором или финализатором, он может отрицательно повлиять на время жизни объекта, если другие объекты поддерживают (или, возможно, даже принимают) ссылку на утилизация объекта во время мероприятий по утилизации. Если вы будете осторожны с тем, как реализовать такую ​​систему, вы можете смягчить возможные побочные эффекты. Однако важно осознавать потенциал, который предлагает такая реализация ... например, увеличенная поверхность атаки, которую злонамеренный кодер может использовать, например, поддерживая ваши объекты транзакций в живых на неопределенный срок.

3
ответ дан 4 December 2019 в 22:27
поделиться

Утилизация должна просто убираться. Я бы реализовал методы Confirm () и Rollback (), если вызывается dispose без первого вызова любого из них, это ошибка, которая должна, по крайней мере, регистрироваться.

0
ответ дан 4 December 2019 в 22:27
поделиться

Конечно, вы можете запускать любые события в методе Dispose. Однако, если вы хотите запускать события, чтобы подтвердить наличие транзакции, я думаю, у вас должен быть отдельный метод для запуска событий. Dispose () - это способ очистки внутренних ресурсов или удаления внутренних экземпляров в качестве известного шаблона. После удаления ваша установка транзакции не должна быть там или больше не должна использоваться. Следовательно, вы можете рассмотреть отдельный метод для подтверждения того, что временное устройство не будет доступно, с флагом или статусом в транзакции, чтобы указать на это.

0
ответ дан 4 December 2019 в 22:27
поделиться

Dispose - это не специальный метод, он не похож на ctor, finalizer или что-то еще - это просто полезный шаблон для уведомления объекта, который использует его потребитель. Нет причин, по которым он не может вызывать события.

4
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: