Как использовать атрибуты C # и рефлексию для внедрения / форсирования поздних привязок на отмеченных объектах? - PullRequest
3 голосов
/ 23 марта 2011

Мне нравятся шаблоны проектирования, проблема в том, что некоторые из них могут быть очень утомительными для реализации.Например, украшение объекта, имеющего более 20 членов, просто раздражает.

Итак, я хотел создать красивую библиотеку шаблонов проектирования, которая будет применяться к классам (как базовым классам или атрибутам) для реализации.этих шаблонов гораздо быстрее и легче.

Проблема в том, что ... Я не совсем уверен, с чего начать - потому что я в основном незнаком с атрибутами и рефлексией.


Iхотел бы использовать атрибуты для пометки Singletons (аналогично тегу Export), Multitons и Decorators ... если это вообще возможно.Но я даже не знаю, с чего начать, чтобы создать одноэлементный атрибут, который изменяет функциональность его экземпляров.

Мои ограниченные исследования привели меня к мысли, что использование отражения / позднего связывания через атрибут и получениедоступ ко всем отмеченным классам в сборке позволил бы вам взломать синглтон ... но я все еще не совсем уверен, как это будет сделано.

Фреймворк, который я нашел, называется Ninject 1.0, создан атрибут Singleton, но библиотека настолько обширна и не имеет документов, что в настоящее время я не могу следовать ее логике.


Я чувствую, что библиотека с такими функциями будетотличный вклад для многих разработчиков там.Таким образом, было бы очень полезно, если бы кто-то мог предоставить некоторый пример кода, который указал бы мне в правильном направлении, чтобы создать один из этих шаблонов в качестве атрибута - чей код не слишком задействован.Или, если кто-то захочет провести меня через реализацию одноэлементного атрибута Ninject, чтобы я мог поработать над этим ...

Спасибо за ваше время и внимание.

1 Ответ

4 голосов
/ 23 марта 2011

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

Шаблон - это действительно обычный способ ведения дел, предназначенный для решения конкретной проблемы .

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

Теперь, после всего этого, действительно можно увидеть, что то, что вы планируете делать, не является правильным способомидти о реализации шаблона (ов).Вы не помечаете код атрибутами и т. Д., А затем называете их шаблонами.Шаблон - это ваш код.Ваш код является шаблоном.Например, вы не помечаете шаблон издателя / подписчика в классе, если он действительно не реализует функции публикации / подписки.Например, вы не помечаете класс «Singleton», и тогда он становится одноэлементным шаблоном;использование шаблона Singleton требует от вас кодирования вашей программы (и ваших классов) вокруг этого дизайна.

Однако вы можете пометить код или классы определенными атрибутами, которые могут помочь в проверка , соответствует ли код / ​​классы определенному шаблону.

Например, вы можете реализовать средство проверки типов, которое проходит через весь ваш класс, проверить, помечено ли что-либо как «издатель», и посмотреть, является ли этот классреализует интерфейс "IPublisher"Или ваша программа проверки типов может проверить, помечен ли какой-либо класс как «Синглтон», позволяет ли конструктор создавать более одного экземпляра одновременно.

Но атрибуты и отражение обычно не являются инструментами для реализовать шаблон.

В C #, где нет множественного наследования, способ реализации шаблонов иногда только через базовый класс.Например, вы можете реализовать шаблон «singleton», объявив базовый класс «SingletonObject», который ограничивается только одним экземпляром.Затем вы выводите из этого базового класса любой класс, которым хотите быть в одиночку.Например, вы можете реализовать шаблон «публикация / подписка», объявив интерфейсы IPublisher и ISubscriber.

Теперь, если вы действительно хотите просто использовать шаблон Decorator в классах C # (согласно заголовку вашего вопроса)), то, что вы ищете, это автоматический генератор объектов-оболочек.Вы можете основывать свою обертку на ExpandoObject, проходить через свойства базового объекта и добавлять свойства в ExpandoObject, который просто делегирует обратно базовому объекту.Затем добавьте новые свойства в ExpandoObject поверх вашего базового объекта.Вуаля!Вы получаете генератор классов-оболочек auto-Decorator-Pattern.

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