Платформа: C # 2.0
Использование: Castle.DynamicProxy2
Я боролся около недели, пытаясь найти хорошую стратегию, чтобы переписать мой DAL. Я попробовал NHibernate, и, к сожалению, он не очень подходил для моего проекта. Итак, я дошел до этого взаимодействия:
Сначала я регистрирую свои DTO и мои средства отображения данных:
MetaDataMapper.RegisterTable(typeof(User)):
MapperLocator.RegisterMapper(typeof(User), typeof(UserMapper));
Это отображает каждый DTO, поскольку он зарегистрирован с использованием пользовательских атрибутов в свойствах DTO, по существу:
[Column(Name = "UserName")]
Затем у меня есть Mapper, который принадлежит каждому DTO, поэтому для этого типа это будет UserMapper. Этот преобразователь данных обрабатывает вызов моей оболочки ADO.Net и затем отображает результат в DTO. Однако я нахожусь в процессе включения глубокой загрузки и, следовательно, отложенной загрузки и, следовательно, где я застрял. По сути, мой пользовательский DTO может иметь объект Address (FK), который требует другого сопоставителя для заполнения этого объекта, но я должен решить использовать AddressMapper во время выполнения.
Моя проблема заключается в обработке типов без необходимости явно просматривать их список (не говоря уже о головной боли, связанной с необходимостью постоянно обновлять этот список) каждый раз, когда мне нужно определить, какой преобразователь следует возвращать. Таким образом, мое решение имело класс MapperLocator, который я регистрирую (как выше) и возвращаю интерфейс IDataMapper, который реализуют все мои средства отображения данных. Затем я могу просто привести его к типу UserMapper, если я имею дело с объектами User. Это, однако, не так просто, когда я пытаюсь определить тип Data Mapper для возврата во время выполнения. Поскольку дженерики должны знать, что они из себя представляют во время компиляции, использование AOP и последующая передача типа во время выполнения не возможны без использования отражения. Я уже немного размышляю, когда сопоставляю DTO с таблицей, читаю атрибуты и тому подобное. Кроме того, мой MapperFactory использует отражение для создания правильного сопоставителя данных. Поэтому я пытаюсь сделать это без раздумий, чтобы максимально сократить эти дорогие звонки.
Я думал, что решение можно найти, обойдя интерфейс, но я еще не смог реализовать эту идею. Тогда я подумал, что решение, возможно, заключается в использовании делегатов, но я не знаю, как реализовать эту идею. Так что ... честно говоря ... я заблудился, не могли бы вы помочь, пожалуйста?