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