Ответ 1
Дело в том, что LINQ to SQL не является истинным Object Relation Mapper (ORM), это генератор уровня доступа к данным. Вы можете сделать это ORM, углубившись вручную, отредактировав файлы XML и играя с SqlMetal и еще что-то, но там, где оно сияет, это как DAL.
Идея ORM - это. У вас есть база данных SQL и объекты домена. Чтобы правильно создать базу данных, вы будете делать что-то (например, нормализацию), которые логически не переводят в правильно спроектированную объектную модель и наоборот. Это называется "Сопротивление импеданса", роль ОРМ заключается в том, чтобы справиться с этим несоответствием в чистом, эффективном и эффективном способе. Менее болезненное взаимодействие с базами данных является почти второстепенным.
Идея репозитория заключается в том, что он инкапсулирует всю логику сохранения и зависимости от инфраструктуры из остальной части вашего приложения. Когда вашему приложению нужен объект Customer, ему не нужно знать, поступает ли он от SQL Server, MySQL, XML файла или членства ASP.NET. После того, как у вас есть эта де-связь, любые изменения, которые вы делаете в своей истории персистентности, не влияют на остальную часть вашего приложения.
С учетом этого становится понятнее, почему он сделал то, что сделал. LINQ to SQL используется для создания DAL, но единственное, что должно быть известно о DAL, это репозиторий, поэтому перевод делается на его объекты домена. Таким образом, он может реорганизовать свою модель своего домена, не беспокоясь о своей истории о настойчивости, и он может реорганизовать свою базу данных, не беспокоясь о том, что он может повлиять на эффект. Он также может начать кодирование бизнес-логики, прежде чем решать вопросы, такие как ORM, или даже где хранить свои данные.
Если бы он использовал реальный ORM (например, NHibernate), этот код сопоставления обрабатывается в другом месте (либо в классах XML, либо при загрузке). Я думаю, что LINQ to SQL (и DAS с открытым исходным кодом Robs, SubSonic) - отличные проекты, но больше предназначены для небольших, двухуровневых приложений, где что-то вроде шаблона репозитория - излишний. Витрина также является хорошей иллюстрацией того, почему дополнительная сложность NHibernate может быть важной. Он мог бы сэкономить много кода, перейдя с чем-то построенным для обработки такого сценария, вместо того, чтобы делать все это вручную.