Создать простой DAL только для чтения?

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

У нас есть база данных IBM iSeries в качестве основного репозитория для стороннего программного обеспечения, используемого для нашего основного бизнеса (финансового учреждения). Частью того, что делает моя команда, является написание приложений, которые каким-то образом сообщают или отключают большое количество этих данных. Раньше мы вручную создавали соединения ADO .NET (кстати, мы используем .NET 3.5 и Visual Studio 2008), вручную писали запросы и т. д.

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

var something = (from t in TableName select t);

И, в идеале, они просто получат несколько сгенерированных сущностей IQueryable или IEnumerable. Это будет сделано внутри нового ядра домена, которое я создаю, где эти объекты будут жить, а приложения будут взаимодействовать с ним через уровень обслуживания запросов/ответов.

Несколько вещей, которые следует отметить:

  1. Сущности, соответствующие таблицам базы данных, должны быть сгенерированы один раз, и мы бы предпочли обновлять их вручную с течением времени. То есть, если столбцы/таблицы добавляются в базу данных, нам не нужно ничего делать. (Если некоторые из них будут удалены, конечно, это сломается, но это нормально.) Но если нам нужно использовать новый столбец, мы должны иметь возможность просто добавить его в нужный класс (ы) без необходимости повторного создания Все это.
  2. Все это должно быть только для SELECT. Мы не делаем полный DAL здесь, потому что мы не хотим иметь возможность сломать что-либо в базе данных (даже случайно).
  3. Нам не нужно какое-либо сопоставление между объектами домена и сгенерированными типами сущностей. Домен едва покрывает часть данных, которые там находятся, большая часть из них нам никогда не понадобится, и мы бы предпочли просто создавать повторно используемые карты вручную с течением времени. У меня уже есть логическое разделение для DAL, где мои классы «репозитория» возвращают объекты домена, я просто ищу лучшую альтернативу ручному ADO для использования внутри классов репозитория.

Какие-либо предложения? Кажется, что то, что я делаю, выходит за рамки обычного спроса на инструменты/учебники DAL/ORM в Интернете, и я ничего не смог найти. Или, может быть, я просто упускаю из виду что-то очевидное?


person David    schedule 09.06.2010    source источник
comment
IBM iSeries... вы имеете в виду сервер DB2?   -  person code4life    schedule 09.06.2010
comment
Похоже, что многие устаревшие приложения здесь используют драйвер DB2 (IBM.Data.DB2.iSeries.dll) для создания соединений ADO. Я не состою в команде iSeries, поэтому я как бы защищен от специфики (в основном из соображений политики). Но я слышал, что в прошлом его называли iSeries и AS400. Так может быть, DB2 работает на AS400? Я не специалист по базам данных IBM, поэтому не знаю правильных ключевых слов :)   -  person David    schedule 09.06.2010
comment
С вашей точки зрения, есть ли что-то неправильное в ручном ADO, кроме фактического ввода всего этого утомительного кода интерпретации IDataReader/IDataRecord?   -  person Jeff Sternal    schedule 09.06.2010
comment
Это и написанные вручную запросы в виде строк. Цель здесь состоит в том, чтобы разработчики могли быстрее и проще писать и поддерживать, меньше подвержены опечаткам (строго типизированные классы сущностей против литеральных строк = ошибки времени компиляции против ошибок времени выполнения, последних из которых лучше избегать) , и, возможно, что-то с небольшим фактором крутости, так что это будет интересно (скажем прямо, ADO скучен) :)   -  person David    schedule 09.06.2010


Ответы (2)


Возможно, вы захотите исследовать это:

http://www.codesmithtools.com/

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

Предупреждение: это не бесплатная программа.

person code4life    schedule 09.06.2010
comment
+1: очень ранняя версия этого (2.6) находится в свободном доступе, работает хорошо, но зависит от .net 1.1. - person Binary Worrier; 09.06.2010
comment
Я на самом деле использовал 2.6 в прошлом и не был особенно в восторге от него. Возможно, стоит вернуться, если я смогу написать для него достойный шаблон. - person David; 09.06.2010

Добавление к ответу code4life.

Недавно я использовал CodeSmith 2.6 в домашнем любимом проекте.
Я адаптировал шаблоны для создания частичных классов с частичными методами CRUD.
Затем я расширил частичные классы и частичные методы, чтобы обеспечить базовое сопоставление, например. когда читается «Заказ», прочитайте связанные «OrderLines» и т. д.

Подобный подход может сработать для вас и быть проще, потому что на самом деле вам нужен только R от CRUD :)

Надеюсь это поможет.

P.S. Мне нужно переключиться с CS 2.6 на что-то другое (возможно, MyGeneration), так как 2.6 зависит от .Net 1.1, что является проблемой, поскольку я перехожу на машину для разработки 64.

ОБНОВЛЕНИЕ

Слышишь.
Удачи, приятель MyGeneration, мы используем CodeSmith здесь в работе, вот почему я выбрал 2.6 дома (я бегло взглянул на MyGeneration, не сразу понял, что было больше времени, чем я должен был уделять этому - поэтому переключился обратно на CS).

MyGeneration — это версия CS с открытым исходным кодом.

Кроме того, почему бы не заставить его генерировать код ВСЕГДА - вы можете настроить его так, как вам нравится, с помощью Partial Classes & Partial Methods, я знаю, что вы думаете, что повторное создание является излишним, но опыт подсказывает мне, что это один из те вещи, которые, если у вас их нет, вам понадобятся, а если они у вас есть и нуждаются в них, вы никогда не заметите.

person Binary Worrier    schedule 09.06.2010
comment
Это может прийти к этому для моих нужд, но я надеюсь избежать этого. Зависимость 1.1 не должна быть проблемой, если я просто сгенерирую код один раз и вручную настрою его в дальнейшем, но на данный момент это большое «если». И я действительно слежу за своим шагом здесь, потому что все, что я реализую, может очень легко стать выгравированным на камне и стать тем, как это делается в течение следующих нескольких лет. - person David; 09.06.2010