AOP, DataMappers и фабрики, могут ли они работать вместе? - PullRequest
0 голосов
/ 18 июля 2009

Платформа: 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 использует отражение для создания правильного сопоставителя данных. Поэтому я пытаюсь сделать это без раздумий, чтобы максимально сократить эти дорогие звонки.

Я думал, что решение можно найти, обойдя интерфейс, но я еще не смог реализовать эту идею. Тогда я подумал, что решение, возможно, заключается в использовании делегатов, но я не знаю, как реализовать эту идею. Так что ... честно говоря ... я заблудился, не могли бы вы помочь, пожалуйста?

1 Ответ

1 голос
/ 18 июля 2009

Я предложу пару вещей.

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

2) Мой вопрос к вам: почему вы пытаетесь реализовать свою собственную инфраструктуру DAL? Вы говорите, что NHibernate не очень подходит, но вы не уточняете это. Вы пробовали любой из десятков других ORM? Каковы ваши критерии? Ваш опубликованный код выглядит очень похоже на отображение Linq2Sql.

Lightspeed и SubSonic - отличные легкие пакеты ORM. Linq2Sql - это простой в использовании картограф, и, конечно же, есть Microsoft Entity Framework, в которой вся команда Microsoft занимается проблемами, которые вы описываете.

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

...