Прежде всего, есть немного предыстории этой проблемы, доступной в моем блоге:
Я знаю, что описания не очень ясны, поэтому я постараюсь обобщить то, что я пытаюсь, как могу, здесь. Приложение представляет собой программу личных финансов. Дополнительную информацию о самой платформе можно найти в конце этого поста.
Существует ряд различных типов плагинов, которые может обрабатывать инфраструктура (например, учетные записи, экспорт, отчетность и т. Д.). Тем не менее, я сосредоточился на одном конкретном классе плагинов, так называемых плагинах данных, так как именно этот класс вызывает у меня проблемы. У меня есть один класс подключаемых модулей данных для учетных записей, один для транзакций и т. Д.
Я на полпути к огромному ре-факторингу, который оставил мне следующую архитектуру для плагинов данных:
- Объект подключаемого модуля данных (реализующий метаданные инициализации, установки и подключаемого модуля) [внедряет
IDataPlugin<FactoryType>
]
- Объект данных (например, учетная запись) [реализует, например,
IAccount
]
- Фабрика для создания экземпляров объекта данных [реализует, например,
IAccountFactory
]
Ранее объект данных и объект плагина были объединены в один, но это означало, что для каждой транзакции, зарегистрированной в учетной записи, необходимо было создать новый плагин транзакции, что вызвало ряд проблем. К сожалению, этот ре-факторинг нарушил мою передачу сообщений. Объект данных реализует INotifyPropertyChanged
, поэтому я столкнулся с новой проблемой, и я не знаю, как ее обойти: объект плагина регистрирует события в посреднике сообщений, но это объекты данных, которые на самом деле запустить события. Это означает, что подключаемый модуль подписки в настоящее время должен подписываться на каждую созданную учетную запись, транзакцию и т. Д.! Это явно не масштабируется.
Насколько я могу сказать, на данный момент у меня есть два возможных решения:
- Сделать объект подключаемого модуля данных посредником для объектов данных и посредника сообщений, возможно, пакетных уведомлений об изменениях. Мне это не нравится, потому что это добавляет еще один уровень сложности к системе обмена сообщениями, который, я думаю, я смог бы обойтись.
- Нежелательная текущая реализация, основанная на событиях, и использование чего-то другого, более легкого в управлении (WCF в памяти?!).
Итак, я действительно спрашиваю:
- Как бы вы решили эту проблему?
- Как вы думаете, какие потенциальные решения я упустил?
- Мой подход даже смутно на ходу / разумный ?! : -)
Как вы можете судить по датам постов в блоге, какой-то вариант этой проблемы облагал меня налогами уже довольно давно! Таким образом, любые ответы будут высоко оценены.
Фон самого каркаса выглядит следующим образом:
Моя структура плагинов состоит из трех основных компонентов: брокера плагинов, менеджера предпочтений и брокера сообщений. Брокер плагинов делает плагин «хлеб с маслом»: обнаружение и создание плагинов. Менеджер предпочтений управляет пользовательскими предпочтениями для платформы и отдельных подключаемых модулей, например, какие подключаемые модули включены, где должны быть сохранены данные и т. Д. Связь осуществляется через публикацию / подписку, когда посредник сообщений находится в середине, собирая все опубликованные типы сообщений и управление подписками. Публикация / подписка в настоящее время осуществляется через интерфейс .NET INotifyPropertyChanged
, который предоставляет одно событие под названием PropertyChanged
; брокер сообщений создает список всех подключаемых модулей, реализующих INotifyPropertyChanged
, и подписывает другие подключаемые модули на это событие. Цель передачи сообщений - позволить подключаемым модулям учетной записи и транзакции уведомлять подключаемые модули хранения об изменении данных, чтобы их можно было сохранить.