Мне нужно работать с приложением, состоящим из двух основных частей:
- Часть бизнес-логики с конкретными бизнес-классами (например, Book, Library, Author,...)
- Общая часть, которая может отображать книги, библиотеки,... в сетях данных, сопоставлять их с базой данных...).
Общая часть использует отражение для получения данных из бизнес-классов без необходимости писать конкретную логику данных или логику базы данных в бизнес-классах. Это прекрасно работает и позволяет нам добавлять новые бизнес-классы (например, LibraryMember) без необходимости корректировки сетки данных и логики базы данных.
Однако на протяжении многих лет код был добавлен в бизнес-классы, которые также используют отражение, чтобы добиться успеха в бизнес-классах. Например. если автор Книги изменен, наблюдатели призваны сказать самому Автору, что он должен добавить эту книгу в свою коллекцию книг, написанных им (Author.Books). В этих наблюдателях передаются не только экземпляры, но также информация, непосредственно полученная из отражения (полевой интерфейс добавляется к вызову наблюдателя, так что вызывающий абонент знает, что поле "Автор" книги изменяется).
Я могу ясно видеть преимущества использования отражения в этих общих модулях (например, сетку данных или интерфейс базы данных), но мне кажется, что использование рефлексии в бизнес-классах - плохая идея. В конце концов, не должно ли приложение работать, не полагаясь на отражение как можно больше? Или использование рефлексии "нормальным способом работы" в XXI веке?
Хорошо ли использовать рефлексию в вашей бизнес-логике?
РЕДАКТИРОВАТЬ: некоторые пояснения к замечанию Кирка:
- Представьте, что автор реализует наблюдателя в Книге.
- Книга вызывает всех своих наблюдателей всякий раз, когда меняется какое-то поле Книги (например, название, год, # страницы, автор,...). Поле "FieldInfo" измененного поля передается в наблюдателе.
- Затем автор-наблюдатель использует это поле для определения того, интересуется ли оно этим изменением. В этом случае, если FieldInfo для поля Author of Book, Author-Observer обновит свой собственный вектор Книги.