У нас есть репо в DAL. BLL ссылается на репозитории через интерфейс - поэтому репозитории привязаны к DAL, но не связаны с BLL. Я не знаю ни одной причины, почему хранилища не могли быть непосредственно в BLL. У нас они есть в DAL, поскольку мы не вкладываем в них ЛЮБУЮ логику. Затем в BLL есть «Менеджеры», которые обертывают репозитории и обрабатывают логику, специфичную для сущности.
FWIW у нас на самом деле есть универсальный Repository(Of IEntity)
и мы используем единство для создания экземпляра соответствующего репозитория по мере необходимости - он очень компактный и довольно элегантный. Все наши объекты POCO реализуют IEntity, который содержит Id
, CreatedDate
и т. Д., Которые являются общими для ВСЕХ наших объектов. Это дает некоторые другие преимущества, когда вам нужно обрабатывать сущности любого типа в общем - CreatedDate
устанавливается репозиторием при вызове CreateInstance()
, ModifiedDate
устанавливается самим контекстом, когда он фиксирует сущность с состоянием Modified
Мы храним сущности в отдельном проекте - DAL должен иметь возможность ссылаться на них, как и BLL. Вы не хотите, чтобы они были в DAL, так как замена DAL вызывала бы проблемы. Вы не можете поместить их в BLL или получите круговую ссылку. Конфигурация для сущностей может находиться в DAL, так как она зависит от источника данных.
Мы стараемся придерживаться BLL, принимая примитивы и возвращая сущности. Будьте осторожны с хранением сущностей в пользовательском интерфейсе слишком долго, особенно в веб-приложении, поскольку у вас может быть другой контекст в DAL к тому времени, когда вы возвращаете сущность в BLL для обработки (т. Е. Между запросами, хранящимися в сеансе или подобном) может привести ко всем видам забавного присоединения / отсоединения сущностей от контекстов и лишит вас некоторых преимуществ, таких как отслеживание изменений.
Надеюсь, это поможет, но если вам нужны какие-либо разъяснения, дайте мне знать