Шаблон хранилища против DAL

Они одинаковы? Просто закончил смотреть учебник по витрине Rob Connery, и они, похоже, похожи на техник. Я имею в виду, когда я реализую объект DAL, у меня есть методы GetStuff, Add/Delete etc, и я всегда пишу интерфейс сначала, чтобы позже переключить db.

Я что-то путаю?

Ответ 1

Ты определенно не тот, кто путает вещи.: -)

Я думаю, что ответ на вопрос зависит от того, какой из пуристов ты хочешь быть.

Если вам нужна строгая точка DDD, это приведет вас к одному пути. Если вы посмотрите на репозиторий как на шаблон, который помог нам стандартизировать интерфейс слоя, который разделяет службы и базу данных, он приведет вас к другому.

Репозиторий с моей точки зрения - это просто четко определенный уровень доступа к данным. Или, другими словами, стандартизованный способ реализации вашего уровня доступа к данным. Существуют разные различия между различными реализациями репозитория, но концепция одинаков.

Некоторые люди помещают больше ограничений DDD в репозиторий, в то время как другие будут использовать репозиторий в качестве удобного посредника между базой данных и уровнем обслуживания. Репозиторий, подобный DAL, изолирует уровень обслуживания от специфики доступа к данным.

Одна проблема с реализацией, которая, по-видимому, делает их разными, заключается в том, что репозиторий часто создается с помощью методов, которые принимают спецификацию. Репозиторий вернет данные, удовлетворяющие этой спецификации. Большинство традиционных DAL, которые я видел, будут иметь больший набор методов, в которых метод будет принимать любое количество параметров. Хотя это может показаться небольшой разницей, это большая проблема, когда вы входите в области Linq и выражения. Наш интерфейс репозитория по умолчанию выглядит следующим образом:

public interface IRepository : IDisposable
{
    T[] GetAll<T>();
    T[] GetAll<T>(Expression<Func<T, bool>> filter);
    T GetSingle<T>(Expression<Func<T, bool>> filter);
    T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
    void Delete<T>(T entity);
    void Add<T>(T entity);
    int SaveChanges();
    DbTransaction BeginTransaction();
}

Является ли это DAL или репозиторием? В этом случае я думаю, что и то и другое.

Ким

Ответ 2

Репозиторий - это шаблон, который можно применять разными способами, в то время как уровень доступа к данным имеет очень четкую ответственность: DAL должен знать, как подключиться к вашему хранилищу данных для выполнения операций CRUD.

Репозиторий может быть DAL, но он также может сидеть перед DAL и действовать как мост между слоем бизнес-объекта и слоем данных. Какая реализация используется, будет варьироваться от проекта к проекту.

Ответ 3

Одно большое различие заключается в том, что DAO является общим способом борьбы с постоянством для любого объекта в вашем домене. С другой стороны, репозиторий имеет дело только с совокупными корнями.

Ответ 4

Я искал ответ на аналогичный вопрос и согласен с двумя ответами высокого уровня. Пытаясь прояснить это для себя, я обнаружил, что спецификации , если, которые идут рука об руку с шаблоном репозитория, реализованы как первоклассные члены модели домена, тогда я могу

  • повторное использование Определения спецификаций с различными параметрами,
  • манипулировать существующими параметрами экземпляров спецификации (например, для специализации),
  • объединить,
  • выполнять бизнес-логику на них, не имея при этом никакого доступа к базе данных,
  • и, конечно, unit-test не зависят от реальных реализаций Репозитория.

Я даже могу зайти так далеко и указать, что если шаблон репозитория не используется вместе с шаблоном Specification, это не действительно "репозиторий", а DAL. Надуманный пример в псевдокоде:

specification100 = new AccountHasMoreOrdersThan(100)
specification200 = new AccountHasMoreOrdersThan(200)

assert that specification200.isSpecialCaseOf(specification100)

specificationAge = new AccountIsOlderThan('2000-01-01')

combinedSpec = new CompositeSpecification(
    SpecificationOperator.And, specification200, specificationAge)

for each account in Repository<Account>.GetAllSatisfying(combinedSpec)
    assert that account.Created < '2000-01-01'
    assert that account.Orders.Count > 200

Подробнее см. Спецификация спецификаций Fowler (что я основал выше).

DAL имел бы специализированные методы, такие как

IoCManager.InstanceFor<IAccountDAO>()
    .GetAccountsWithAtLeastOrdersAndCreatedBefore(200, '2000-01-01')

Вы можете увидеть, как это может быстро стать громоздким, тем более что вам необходимо определить каждый из DAL/DAO-интерфейсов с помощью этого подхода и реализовать метод запроса DAL.

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

Ответ 5

Мое личное мнение состоит в том, что речь идет о картографии, см.: http://www.martinfowler.com/eaaCatalog/repository.html. Таким образом, вывод/вход из репозитория являются объектами домена, которые на DAL могут быть чем угодно. Для меня это важное дополнение/ограничение, поскольку вы можете добавить реализацию репозитория для базы данных/службы/независимо от другого макета, и у вас есть четкое место, чтобы сосредоточиться на выполнении сопоставления. Если вы не должны использовать это ограничение и иметь сопоставление в другом месте, то различные способы представления данных могут повлиять на код в местах, которые он не должен изменять.

Ответ 6

Все о интерпретации и контексте. Они могут быть очень похожими или даже очень разными, но до тех пор, пока решение выполняет эту работу, что называется именем!

Ответ 7

Преимущество использования шаблона репозитория заключается в том, чтобы высмеять ваш уровень доступа к данным, чтобы вы могли протестировать код своего бизнес-уровня без вызова кода DAL. Есть и другие большие преимущества, но для меня это очень важно.

Ответ 8

Из того, что я понимаю, они могут означать в основном одно и то же - но именование зависит от контекста.

Например, у вас может быть класс Dal/Dao, который реализует интерфейс IRepository.

Dal/Dao - термин слоя данных; более высокие уровни вашего приложения рассматривают с точки зрения репозиториев.

Ответ 9

Итак, в большинстве (простых) случаев DAO является реализацией репозитория?

Насколько я понимаю, DAO имеет дело с доступом к db (CRUD - No selects хотя?!), в то время как репозиторий позволяет вам абстрагироваться от всего доступа к данным, возможно, являясь фасадом для нескольких DAO (возможно, для разных источников данных).

Я на правильном пути?

Ответ 10

В внешнем мире (например, клиентский код) репозиторий аналогичен DAL, за исключением:

(1) методы вставки/обновления/удаления ограничены тем, что объект-контейнер данных является параметром.

(2) для операции чтения может потребоваться простая спецификация, например DAL (например, GetByPK) или расширенная спецификация.

Внутри он работает с уровнем Data Mapper (например, контекст фреймворка сущности и т.д.) для выполнения реальной операции CRUD.

Какой шаблон репозитория не означает: -

Кроме того, я видел, как люди часто путаются, чтобы иметь отдельный метод Save в качестве образца образца шаблона репозитория, помимо методов Insert/Update/Delete, которые фиксируют все изменения в памяти, выполняемые методами вставки/обновления/удаления, база данных. Мы можем иметь метод сохранения определенно в репозитории, но не репликация заключается в том, чтобы изолировать CUD (создание, обновление, удаление) в памяти и методы сохранения (которые выполняют фактическую операцию записи/изменения в базе данных), но ответственность за образец работы.

Надеюсь, это поможет!

Ответ 11

Репозиторий - это шаблон, это способ реализовать вещи стандартизованным способом повторного использования кода, как мы можем.