Как создать прозрачный API при использовании контейнера для отслеживания объектов во время выполнения - PullRequest
1 голос
/ 17 января 2012

Цель: Что я хотел бы сделать, так это реализовать консоль для моего приложения WinForm для запроса свойств определенных объектов (т.е. реализующих интерфейс) во время выполнения.Я хотел бы перечислить все экземпляры некоторого Type и отобразить все свойства выбранного экземпляра.Ага.

После прочтения вопроса " Как получить все экземпляры всех загруженных типов, которые реализуют данный интерфейс? ", я убедился, что это невозможно сделать разумным способом.(т.е. не обходя кучу ?!) и оценивая подход контейнера , так что экземпляры будут регистрироваться в контейнере и отменять регистрацию в нем при уничтожении и т. д., но я не удовлетворен альтернативами, которые я 've получил:

  • Вывод всех классов из базового класса, который обрабатывает контейнерную работу: я бы не предпочел наследование.
  • Реализация контейнерной службы и внедрение ее конструктором: лучший из предложенных мною, но я ищу более прозрачное решение.

Вопрос: При использовании контейнерного подхода есть ли лучший (более прозрачный, минимальный фиксированный) шаблон?

Примечание: альтернативные способы для той же цели также приветствуются.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

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

Однако , Я думаю, что лучшим решением было бы добавить в интерфейс пару методов: активировать (или, может быть, инициализировать) и деактивировать (утилизировать?).Методы класса, реализующие Activate и Deactivate, могут работать, как описано выше, или вызывать контейнерную службу, как вам угодно.

Вы должны помнить, чтобы вызывать эти методы, но они дают вам большую мощность.Они могут обрабатывать другие инициализации, которые могут не работать в конструкторе.Они позволяют отдельным объектам отказаться от вашего контейнера, если вы обнаружите, что некоторые объекты не должны быть там.Это также позволяет ему выбирать другие контейнеры, которые вы можете использовать в будущем.Короче говоря, объекту любого класса предоставляется большая свобода для управления своим бизнесом в структуре программы, и программа может создавать и управлять множеством сложных объектов совершенно разных классов с помощью нескольких простых вызовов методов.

0 голосов
/ 17 января 2012

Если наследование для вас неприемлемо, вы можете попробовать использовать AOP-фреймворк, такой как PostSharp для отслеживания объектов. Вы можете украсить все объекты, которые вы хотите отслеживать, с помощью подходящего атрибута и связать этот атрибут с пост-острой конструкцией.

Я использовал это для успешной реализации отмены повторения.

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