Подтвердить что ты не робот

LINQ to SQL и шаблон репозитория

Мне кажется, что я бегу кругами. Я не могу понять, что использует правильный шаблон репозитория LINQ to SQL. Если вы знакомы с Rob Conery MVC Storefront, вы будете что его реализация обертывает LINQ-сгенерированные модели другим классом и рассматривает созданный LINQ объект просто как объект Использование шаблона IRepository с LINQ to SQL в его версии IRepository <T> , где он просто возвращает объекты DTO из репозитория?

Где должна быть внедрена и проверена бизнес-логика? Является ли это в отдельном слое, все вместе называемом репозиторием при сохранении/обновлении, или он встроен в класс оболочки?

4b9b3361

Ответ 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 может быть важной. Он мог бы сэкономить много кода, перейдя с чем-то построенным для обработки такого сценария, вместо того, чтобы делать все это вручную.

Ответ 2

Это зависит от того, где определены DTO и как вы хотите его протестировать. Если вы используете DBML, LINQ to SQL хочет сгенерировать объекты данных в слое данных. В то время как LINQ to SQL поддерживает незнание стойкости, оно не мешает сделать это легко. Entity Framework не поддерживает его вообще.

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

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

Сохранение полностью отдельных доменных объектов делает модульное тестирование и инвертирование управления (IoC) более "чистым", но увеличивает количество кода, которое вы имеют (так двунаправленный).

Ответ 3

Являются ли сгенерированные объекты сериализуемыми? У меня сложилось впечатление, что это не так. Это просто случай изоляции, как сказал Марк Гравель.

Что делать, если вы переключаете репозиторий и имеете MySQL, Oracle, XML файлы, веб-службы или любой другой поставщик данных (репозиторий)? Вы бы привязались к сборке LINQ to SQL, чтобы ссылаться на сущности, не так ли? Который, конечно, вы не хотели бы.