Вы могли создать свой собственный сценарий для рабочего муравья, например, названный ant.sh как:
#!/bin/sh
JAVA_HOME=</path/to/jdk>; export JAVA_HOME
ant $@
и затем запущенный Ваш скрипт.
$ chmod 755 ant.sh
$./ant.sh clean compile
или безотносительно целевого объекта Ant Вы хотите работать
Вот мое мнение: При работе с любым нетривиальным приложением. Использование ваших объектов 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 (при условии, что у вас есть общедоступные интерфейсы для ваших репозиториев и объектов домена). Это вызовет логическое разделение между вашей моделью предметной области и доступом к данным.
Поместите весь ваш уровень доступа к данным в отдельный проект (опять же, чтобы обеспечить это разделение).
Поместите объявления вашего интерфейса в отдельный проект (это гарантирует, что вы не столкнетесь с циклическими ссылками).
Надеюсь, это поможет ...
Это одно из лучших обсуждений темы, которые я видел:
http://blog.wekeroad.com/blog/linqtosql-momma-said-knock-you -out /
В конце концов, решения о связывании и согласованности носят ситуативный характер, и вы должны решить, что лучше всего для вашей ситуации.
Когда ваше приложение перерастет LinqToSql, насколько легко будет выдернуть LinqToSql и вставить другой ORM на своем месте? Это то, о чем вы должны серьезно подумать.
В общем, сведите к минимуму знания вашего бизнес-уровня о LinqToSql. LinqToSql должен быть полностью скрыт от уровня вашего пользовательского интерфейса (ваш бизнес-уровень составляет значительную часть этого щита). С LinqToSql очень легко пойти по неправильному архитектурному пути, и может быть очень сложно вернуться на правильный путь постфактум.
Классы, сгенерированные конструктором linq2sql, являются частичными классами, поэтому вы можете расширять их и помещать в них свою бизнес-логику. Идея состоит в том, что linq используется для сохранения / восстановления этих сущностей, чтобы вы могли избежать сопоставления, о котором вы говорите.
У меня действительно был аналогичный вопрос по этой теме, хотя мои намерения были немного другими. Было рекомендовано использовать классы 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.
Надеюсь, это поможет.