2009-07-18 5 views
0

Платформа: C# 2.0 Использование: Castle.DynamicProxy2AOP, DataMappers и фабрики, могут ли они работать вместе?

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

Моя проблема заключается в том, чтобы обрабатывать типы без явного перечня их списка (не говоря уже о головной боли, которая всегда должна была обновлять этот список) каждый раз, когда мне нужно определить, какой картограф вернется. Поэтому в моем решении был класс MapperLocator, который я зарегистрировал (как указано выше) и возвратил интерфейс IDataMapper, который реализуют все мои картотеки данных. Затем я могу просто применить его для ввода UserMapper, если я имею дело с объектами User. Однако это не так просто, когда я пытаюсь определить тип Data Mapper для возврата во время выполнения. Поскольку generics должны знать, что они находятся во время компиляции, используя AOP, а затем передача типа во время выполнения не является опцией без использования отражения. Я уже делаю справедливое отражение, когда я сопоставляю DTO с таблицей, читая атрибуты и т. Д. Плюс мой MapperFactory использует отражение для создания правильного отображения данных. Поэтому я пытаюсь сделать это без размышлений, чтобы максимально снизить эти дорогие звонки.

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

ответ

1

Я предлагаю пару вещей.

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

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

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

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

Смежные вопросы