Шаблон проектирования, позволяющий вводить код в определенных точках - PullRequest
2 голосов
/ 25 августа 2009

Я пытаюсь разрешить разработчикам расширять мой код в определенных точках исполнения.

Мой конкретный пример - оболочка транзакции базы данных. Оболочка заботится о многих деталях, которые мы хотели абстрагировать от разработчика, и используется в нескольких проектах.

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

Например, каждая таблица в нашей базе данных имеет поле «Дата ввода», которое обновляется при каждом изменении записи. Однако мы хотим, чтобы все даты были одинаковыми для транзакции, несмотря на то, что было затронуто много записей (то есть 4 записи таблицы A, 1 запись в таблице B, ...).

Моя мысль состоит в том, чтобы определить точки перехвата "TransactionStarting", "TransactionStarted", "StatementExecuting", "StatementExecuted", ... и передать объект контекста в каждую точку.

Затем проект может определить класс «EnteredDateManager», который хранит текущую дату во время точки «TransactionStarted» и обновляет свойство EnteredDate каждого объекта во время точки «StatementExecuting».

Я хотел бы установить это в файле web / app.config и разрешить регистрацию нескольких классов перехвата. Если зарегистрировано более одного класса, их следует запускать в том порядке, в котором они были зарегистрированы.

Я думал просто о возбуждении событий, но я хочу, чтобы порядок имел значение. Я также хочу иметь возможность поделиться состоянием между различными точками. В моем примере выше свойство EnteredDate установлено в точке TransactionStarted и используется в точке StatementExecuting.

Это шаблон Цепочки Ответственности? АОП? Это похоже на работу конвейера ASP.Net, но, насколько я знаю, они используют события и не гарантируют порядок.

Было бы замечательно любое направление / примеры.

Спасибо

Ответы [ 3 ]

1 голос
/ 25 августа 2009

Для меня это звучит как Аспектно-ориентированное Программирование. Проверьте PostSharp .

Вот пример трассировки с их сайта:

public class TraceAttribute : OnMethodBoundaryAspect 
{ 
  public override void OnEntry( MethodExecutionEventArgs eventArgs) 
  { Trace.TraceInformation("Entering {0}.", eventArgs.Method);  } 

  public override void OnExit( MethodExecutionEventArgs eventArgs) 
  { Trace.TraceInformation("Leaving {0}.", eventArgs.Method);   } 
}

Я использую его для ведения журналов / трассировки, кэширования и мониторинга производительности.

0 голосов
/ 25 августа 2009

Если это специфично для .NET (вы упомянули ASP.NET), я настоятельно рекомендую заглянуть в пространство имен System.Transactions и прочитать о создании и регистрации менеджеров ресурсов в транзакции.

Используя TransactionScope, вы можете создать транзакцию в контексте, а менеджер ресурсов, выполняющийся в этом контексте, может обнаружить присутствие транзакции и зарегистрироваться в ней (это будет синонимом вашего события TransactionStart). После регистрации каждый менеджер ресурсов может либо зафиксировать свои изменения, либо вернуться назад и инициировать откат транзакции.

Пространство имен Systen.Transactions, которое было представлено в .NET 2.0, предлагает несколько довольно мощных инструментов для создания транзакций и управления транзакционными ресурсами. У вас есть возможность использовать обе облегченные транзакции или, если вам нужны более сложные, полностью распределенные транзакции, управляемые службой MSDTC. Транзакции могут быть однофазными или двухфазными, предлагая большую гибкость и стабильность в случае сбоя транзакции.

0 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...