Беспорядок между DTOs (linq2sql) и Объектами класса!

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

#!/bin/sh
JAVA_HOME=</path/to/jdk>; export JAVA_HOME
ant $@

и затем запущенный Ваш скрипт.

$ chmod 755 ant.sh
$./ant.sh clean compile

или безотносительно целевого объекта Ant Вы хотите работать

6
задан Daniel Schilling 9 November 2011 в 23:55
поделиться

4 ответа

Вот мое мнение: При работе с любым нетривиальным приложением. Использование ваших объектов linq2Sql в качестве модели предметной области - действительно плохая идея. Я вижу linq2Sql как ORM и не более того. Базы данных (которым linq2Sql имеет прямое соответствие) являются нормализацией данных . Классы (в смысле OOAD) являются нормализацией поведения (не данных).

[эти объекты класса в основном являются зеркальным отображением] ...

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

Итак, вот мое решение:
Я «запрограммировал интерфейс».

Допустим, у меня есть PersonDto (Dto, обозначающее объект передачи данных) со свойствами FirstName, LastName, Age (которые напрямую относятся к столбцы базы данных).

Я создал интерфейс IPerson , и мой PersonD реализовал его.


  [Table(Name="Persons")]
  internal class PersonDto : IPerson
  {
      ....
  }

И мой метод репозитория принимал и извлекал IPerson в отличие от класса Linq2Sql


    IPerson somePerson = _repository.Get(someGuid);
    somePerson.FirstName = "SomeName";
    _repository.Save(somePerson);

Этот подход очень хорошо сработал для меня. Когда я чувствую, что мне нужно отклониться от DTO, я могу сделать это довольно легко благодаря интерфейсу, представляющему мой объект, в отличие от DTO.

Некоторые общие указатели: Создайте свой DTO вручную ... Я знаю, это звучит безумно, но вы обнаружите, что это действительно хорошо работает с подходом к разработке, основанным на тестировании сверху вниз. Объекты вашего DTO (linq2Sql) будут очень легкими и будут открыты для изменений за пределами конструктора .dbml.

Сохраните ваши DTO и DataContext внутренними. Нет никаких причин для публичного раскрытия ваших dto (при условии, что у вас есть общедоступные интерфейсы для ваших репозиториев и объектов домена). Это вызовет логическое разделение между вашей моделью предметной области и доступом к данным.

Поместите весь ваш уровень доступа к данным в отдельный проект (опять же, чтобы обеспечить это разделение).

Поместите объявления вашего интерфейса в отдельный проект (это гарантирует, что вы не столкнетесь с циклическими ссылками).

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

5
ответ дан 10 December 2019 в 00:42
поделиться

Это одно из лучших обсуждений темы, которые я видел:

http://blog.wekeroad.com/blog/linqtosql-momma-said-knock-you -out /

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

Когда ваше приложение перерастет LinqToSql, насколько легко будет выдернуть LinqToSql и вставить другой ORM на своем месте? Это то, о чем вы должны серьезно подумать.

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

2
ответ дан 10 December 2019 в 00:42
поделиться

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

0
ответ дан 10 December 2019 в 00:42
поделиться

У меня действительно был аналогичный вопрос по этой теме, хотя мои намерения были немного другими. Было рекомендовано использовать классы Linq2SQL в качестве объектов предметной области и использовать преимущества частичных классов, как уже упоминалось другими. Меня больше всего беспокоила форма этих объектов (то есть имена свойств) и доступность членов класса (например, частные или защищенные).

Форма объектов и даже доступность могут быть решены с помощью шаблонов t4 где Damien Guard собрал шаблон T4, чтобы вы могли контролировать форму классов, которые Linq2Sql будет генерировать для вас. Его можно увидеть здесь Шаблон T4 для Linq2SQL .

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

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

и доступность членов класса (например, частные или защищенные).

Форма объектов и даже доступность могут быть решены с помощью шаблонов t4, где Дэмиен Гвардии собрал шаблон T4, чтобы вы могли контролировать форму классов, которые Linq2Sql сгенерирует для вас. Его можно увидеть здесь Шаблон T4 для Linq2SQL .

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

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

и доступность членов класса (например, частные или защищенные).

Форма объектов и даже доступность могут быть решены с помощью шаблонов t4, где Дэмиен Гвардии собрал шаблон T4, чтобы вы могли контролировать форму классов, которые Linq2Sql сгенерирует для вас. Его можно увидеть здесь Шаблон T4 для Linq2SQL .

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

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

Форма объектов и даже доступность могут быть решены с помощью шаблонов t4, в которых Дэмиен Guard собрал шаблон T4, чтобы вы могли управлять формой классов, которые Linq2Sql будет генерировать для вас. Его можно увидеть здесь Шаблон T4 для Linq2SQL .

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

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

Форма объектов и даже доступность могут быть решены с помощью шаблонов t4, в которых Дэмиен Guard собрал шаблон T4, чтобы вы могли управлять формой классов, которые Linq2Sql будет генерировать для вас. Его можно увидеть здесь Шаблон T4 для Linq2SQL .

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

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

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

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

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

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

3
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: