Прежде всего, извините за длинное описание моего мозгового пространства ниже.Я до сих пор обдумываю множество этих новых идей, поэтому я уверен, что что-то неправильно описываю.Пожалуйста, не стесняйтесь поправлять меня, где я не прав.
Мы находимся в фазе исследований и разработок нового сайта ASP.net MVC2 и хотим, чтобы мы могли 1) отделить наше хранилище данных от нашего приложения, 2) разрешить тестирование нашего приложения с помощью модульных тестов и3) позволяют нам изменить наше хранилище данных или использовать что-то другое, кроме Linq2SQL, по линии.
Эта, казалось бы, простая цель открыла для меня целый новый мир, который включает в себя шаблон Repository, IoC, DI и всевиды других вещей, которые заставляют мою голову плавать.Вот что находится в центре внимания, или, по крайней мере, то, что я считаю несколько правильным планом для достижения наших целей:
У нас будет несколько ISpecificRepository интерфейсы, которые определяют контракт между пользователями интерфейса и базовым хранилищем данных.
Реализации SpecificRepository будут запрашивать конкретные хранилища данных и возвращать POCO, представляющий объекты нашего домена (илиих коллекции).
Наш сервисный уровень будет выполнять бизнес-логику приложения с использованием экземпляра ISpecificRepository, передаваемого различным методам сервиса, и передавать эти объекты домена POCOназад к нашему уровню представления.
Как уже упоминалось, мы планируем использовать Linq2SQL для реализации наших конкретных репозиториев для приложения и решили отделить наш уровень обслуживания от этой реализации, создав POCOдля наших доменных объектов и создать отображение наи из этих объектов в объекты, созданные LINQ.На уровне сервиса мы можем затем создать бизнес-логику для запроса к хранилищу, добавить данные и делать все остальное, что нам нужно сделать для каждого варианта использования.Это выглядит нормально, но меня беспокоит то, что, поскольку мы используем Linq2SQL, наша конкретная реализация репозитория Linq теперь должна будет содержать все многие запросы Get , которые требуются сервисному уровню для эффективной реализации бизнес-логики.
Мне любопытно, не нарушит ли это каким-либо образом шаблон репозитория , поскольку теперь мы размещаем специфичную для приложения логику не на уровне сервисов, а в репозитории.
Причина, по которой я чувствую, что нам нужно сделать это таким образом, заключается в том, что я могу писать более эффективные запросы Linq в моем конкретном репозитории Linq, используя различные DataLoadOptions и т. Д., Не возвращая IQueryable из моего репозитория на мой уровень обслуживаниягде, казалось бы, такая логика на самом деле принадлежит.Кроме того, все примеры интерфейсов IRepository, которые я видел, кажутся очень легковесными и предоставляют лишь несколько методов для GetByID, GetAll, Find, Insert, Delete и SubmitChanges в базовое хранилище данных.В моем случае, похоже, что мои конкретные репозитории будут делать гораздо больше.
Спасибо за чтение этого места.Любая помощь, которая может прояснить мои заблуждения, будет принята с благодарностью.
-Mustafa