Каков наилучший способ применения свойств, которые должны быть реализованы на каждом подклассе в * различных * полях?
Я пытаюсь найти "лучший" способ реализации гибкой модели сущностей служб данных SQL, где каждый класс может храниться как сущность, даже классы с производными данными.
Пример: каждый подкласс имеет разные
string Id
string Kind
Dictionary<string, object> Properties
Пока что я двигаюсь в направлении наличия как класса Entity (с вышеупомянутым), так и базового класса, который имеет некоторую коллекцию, такую как
Dictionary<string, Entity> data
И пусть каждый подкласс добавляется в этот словарь и просто получает / устанавливает свойства, такие как
data["EntityKind"].Properties["PropertyName"]
Однако, так как каждый класс имеет только ОДНУ сущность, кажется, что я должен использовать какой-то стек (intead of Dictionary), где каждый уровень иерархии точно знает, где он находится. Затем мне пришло в голову, что наследование классов - это стек, поэтому я подумал, что, может быть, мне просто не хватает какой-то огромной концепции ОО, которая действительно упростит все это. Что-то вроде
abstract eachsubclassmusthaveitsown Entity entity
1 ответ
Каждый класс является сущностью, и вы хотите связать с ней некоторые метаданные сущности?
Похоже, атрибуты могут быть вашим лучшим выстрелом.
Вы бы определили класс EntityAttribute
с членами для хранения метаданных, необходимых для описания объекта. Это позволит вам пометить классы сущностей с помощью [Entity]. Если все поля являются обязательными, присвойте классу атрибута один конструктор, который требует передачи значений.
Затем используйте отражение, чтобы обнаружить классы сущностей. Обратите внимание, что вам нужно выполнить этот процесс обнаружения только один раз, а затем кэшировать его, поэтому производительность отражения не должна быть проблемой.