2009-06-26 3 views
4

Этот вопрос вроде пула. Мы пытаемся определить лучшую архитектуру при использовании ORM, например LINQ to SQL. Аргумент, который мы определяем, относится к той структуре, в которой другие приложения будут обращаться к любому корыту напрямую, ссылаясь на DLL или через веб-сервис. У нас есть приложения .NET и PHP-приложения.Архитектура LINQ to SQL. Что лучше?

Возможности:

Нескольких данных контексты: Separting базы данных в единицы работы и создавать отдельные контексты для каждого из них.

За:

  • Простота использования
  • Классов будут разбиты на разные пространства имен
  • Меньшего домена для поддержания

Против:

  • объектов должны быть дублируется, если связанных, создание технического обслуживания ад
  • объекты не могут быть переданы между контекстом, создавая необходимость другого удара по базе данных

Single контекста данных: Все таблицы, представления, процедуры, находятся в том же огромном контексте.

Плюсы:

  • Нет дублирования
  • отношения просты в управлении, basicaly LINQ заботится о нем.
  • Лучшая производительность, меньше попаданий на БД.

Минусы:

  • Все таблицы находятся в том же пространстве имен, код завершения становится орешки
  • Не самое лучшее для дизайнера (по крайней мере, на VS2008)
  • не может быть избирательным в том, что сохранить, а что нет. Сохраните все или удалите весь режим.

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

Спасибо всем

+0

Кроме того, EF - но очень родственный: http://stackoverflow.com/questions/1028739/should-i-create-a-ado-net-entity-data-model- for-every-table-or-one-for-my-whole –

ответ

5

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

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

Другой аспект, который я понял во время упражнения, заключается в том, что использование LinqToSql напрямую неэффективно в условиях организации. Если у вас есть проект, в котором команда будет выполнять разработку вместо одного человека, вы должны «защитить» LinqToSql от них. Должен быть «шериф», который будет обрабатывать домен, и вы также должны использовать какой-то механизм абстракции для защиты модели от злоупотреблений (я реализовал шаблон хранилища, и он работал хорошо, но вы могли найти разные подходы).

Я также столкнулся с проблемой создания некоторых логических групп внутри домена. Хорошо, что я сделал, чтобы использовать некоторые методы DDD (Domain Driven Design) для создания так называемых агрегатов. Агрегаты - это логическое расположение объектов внутри домена, где у вас есть корневой объект (который работает как агрегатор) и несколько других объектов спутников, связанных между ними. Вы можете сделать это, создав несколько новых объектов в домене LinqToSql. Эти новые объекты будут отключены от базы данных и будут работать как агрегаторы. Такой подход позволит вам создать «поддомены» внутри вашего домена и помочь вам получить лучший дизайн.

В конце я понял, что лучший способ использовать LinqToSql - использовать контекст как простой DAL. Повторно используйте его домен с некоторыми расширениями (где мы можем использовать T4, чтобы помочь нам создать код), где сущности преобразуются в DTO (объекты передачи данных), чтобы вывести данные на другие уровни.

Я издаю (это еще не закончена) шаги, которые я сделал во время тренировки в моем блоге: http://developmentnirvana.blogspot.com/

2

На мой взгляд, данные, контекст скрывает прямо позади репозитория интерфейс - позволяет нам поменять реализацию, если нам нравится (LINQ к SQL/EF/NHibernate/LLBLGen/и т.д.). Таким образом, специфика контекста (ов) данных составляет в значительной степени деталь реализации. Пока он проходит модульные испытания; -p

Огромная редко бывает хорошей идеей; крошечный редко бывает полезен ... Я, как правило, разбиваю систему на связанные куски (обычно связанные с различными интерфейсами репозитория) и думаю об этом на этом уровне.У меня есть другие мысли здесь: Pragmatic LINQ - хотя я бы с радостью отложил любую мудрость от Frans и т. Д.

1

Есть еще две вещи, которые следует учитывать при использовании LINQ к SQL:

  1. Хотя это не устаревший, Microsoft заявила, что фокус для будущего развития будет Entity Framework, а не LINQ to SQL.
  2. LINQ to SQL связывает вас непосредственно с структурой вашей базы данных. Если вы используете Entity Framework, вы сможете проектировать свои объекты таким образом, который не зависит от вашей реализации базы данных. Например, если вы решили разбить один объект на две таблицы, ваши абоненты не должны знать.
+0

Похоже, что L2S не мертв: http://herdingcode.com/?p=187 –

+0

То, что я сказал, «не устарело», и «фокус на будущее развитие будет EF ». –

+0

Фактически происходит то, что EF - это то, что рекомендует Microsoft, но L2S будет развиваться и обновляться по мере необходимости. Посмотрите на журнал VS в прошлом месяце. – Oakcool

0

Итак, примерно через год развития в нескольких контекстах я узнал, что не стоит использовать несколько контекстов, проблема возникает, когда у вас есть таблица, которая должна действительно существовать в 2 или более контекстах, обычно от многих до многих отношений. Что произойдет, так это то, что в середине может быть только запись, вставленная, когда две другие таблицы вставили свои записи, поэтому, если вы используете L2S так же, как и для других вопросов, эта запись будет создана сначала с FK, равной 0 (Zero), и это неверно (ссылочная целостность), что вызывает ошибку. Это один из неудобных я нашел, но я мог бы перечислить еще несколько, если потребуется. Теперь решение, которое я использую, - это создать «Планировщик», этот парень отвечает за ожидание определенных условий (оба родителя имеют действительный идентификатор, отличный от 0 (Zero)), затем он вставляет, это делается в общем случае, чтобы разрешить столько специальных специализаций, сколько мне нужно (у меня 6 Контекстов), и он использует событие PropertyChanged, чтобы как-то уведомлять изменения планировщика.

Итак, самое главное в этом посте, ИСПОЛЬЗУЙТЕ ЕДИНСТВЕННЫЙ КОНТЕКСТ, что если вам не нравятся головные боли (я вообще этого не делаю). Тогда после всего, что сказал кто-то может спросить, почему я продолжил с несколькими Контекстами, ну, скажем, это было решение, которое пришло сверху меня, и у меня была нулевая сила, чтобы сопротивляться. (Все, хотя я действительно пробовал, тяжело)