2016-04-09 1 views
0

В структуре Onion внешний слой может получить доступ ко всем внутренним слоям. Если я пойду этим, мой внешний слой (который является слоем UI/Controller в MVC) может напрямую обращаться к приложениям/бизнес-сервисам и репозиториям. Теперь мой контроллер может создать модель домена и сохранить ее в хранилище данных с помощью репозитория. И, таким образом, обходим проверку и другие бизнес-правила, написанные на бизнес-уровне. По-моему, я чего-то не хватает. Пожалуйста помоги.Onion Framework: если UI/контроллеры имеют прямой доступ к репозиторию

public SpeakerController(IConferenceRepository conferenceRepository, 
         IUserSession userSession, IClock clock) 
    : base(userSession) { 
    _conferenceRepository = conferenceRepository; 
    _clock = clock; 
    _userSession = userSession; } 

из http://jeffreypalermo.com/blog/the-onion-architecture-part-2/

ответ

1

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

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

Я нашел Alistair Cockburn's Hexagonal Architecture, освещающий и более простой, что луковая архитектура. В основном есть «внутри моего приложения» и «вне моего приложения». В любое время, когда вам нужно пересечь эту границу, вам нужен адаптер для защиты вашего приложения от деталей реализации.

+0

Если я правильно понял вас, вы хотите сказать, что нет необходимости иметь методы обёртки/пропуска в бизнес-классе для работы CRUD. Хорошо использовать методы репозитория в пользовательском интерфейсе. Для меня «Проверка бизнес-правил» в репозитории не является хорошей идеей. Это победит цель создания бизнес-уровня. – Pragmatic

+0

Существует 2 различных вопроса: справочные данные и валидация. Я обработаю их отдельными комментариями. Re: Reference Data Скажем, у меня есть таблица под названием StateOrProvince. Возможно, у меня нет бизнес-правил для этих данных, кроме обязательных полей и уникальности. Эти правила могут быть введены в действие базой данных. Для этих данных нет операций, кроме CRUD. Разработка модели домена для такого рода данных может быть чрезмерной. В этом случае я обычно просто привязываю свое мнение непосредственно к своей ORM. –

+0

Re: Validation Вы пишете логику проверки в своем доменном слое. У вас должны быть абстракции, которые представляют собой уровень персистентности, определенный на вашем доменном уровне, который могут использовать объекты вашего домена. Нет причин, по которым вы не можете «вызывать» логику проверки вашего объекта домена в реализации вашего уровня персистентности. На самом деле, если вы внимательно посмотрите на диаграмму OA, реализация сохранения сохраняется на одной из самых удаленных строк диаграммы. Это означает, что вы получаете полный контекст домена в своем уровне персистентности. Вы могли бы также использовать его. –

Смежные вопросы