Когда стоит передавать в сервисы бизнес-слоя текущего пользователя?

141
11 марта 2018, 20:06

У Марка Симана в его книге Dependency Injection есть пример, когда он пишет сервис слоя бизнес-логики (страница 64):

HomeController делегирует большую часть своей работы классу ProductService, продемонстрированному в следующем листинге. Класс ProductService соответствует классу Мэри с тем же именем, но на данный момент он является подлинным классом доменной модели.

Листинг 2-6: Класс ProductService
public class ProductService
{
    private readonly ProductRepository repository;
    public ProductService(ProductRepository repository)
    {
        if (repository == null)
        {
            throw new ArgumentNullException("repository");
        }
        this.repository = repository;
    }
    public IEnumerable<DiscountedProduct> GetFeaturedProducts(IPrincipal user)
    {
        if (user == null)
        {
        throw new ArgumentNullException("user");
        }
        return from p in this.repository.GetFeaturedProducts() 
               select p.ApplyDiscountFor(user);
    }
}

Меня интересует вот этот момент, что в метод GetFeaturedProducts передаётся пользователь - а точнее оставшийся за кадром момент, делать ли так со всеми методами, чтобы бизнес-логика контролировала все операции и никак обойти её было нельзя.

Допустим, в приложении разрешено создавать продукты только сотрудникам, входящим в группу "администраторы". Реализовать это бизнес-требование в asp.net можно двумя способами:

  • Просто навесить на метод контроллера атрибут [Authorize(Roles = "Admin")] и на этом считать достаточным такую проверку. Где-то в бизнес-логике будет ProductService c методом Create. Во входных параметрах метода не будет передан пользователь.
  • Проверить и на контроллере Authorize Roles и передавать внутрь каждого метода ProductService одним из параметров IPrincipal user.

Если читать рекомендации по архитектуре, то помимо ответственностей, которые относятся к одному конкретному слою - выделяются ещё и ответственности, которые "пронизывают все слои приложения" (логирование и та же авторизация).

Здесь такой же случай: непонятно, нужно ли подобные проверки делать только на уровне бизнес-логики или нужно дублировать и в слое приложения?

READ ALSO
Как подключиться к sql server&#39;у не через localhost?

Как подключиться к sql server'у не через localhost?

Есть строка подключения:

160
C# DrawEllipse определение координат

C# DrawEllipse определение координат

Отрисовав 2 эллипса

161
Передать параметры из C# в библиотеку C++

Передать параметры из C# в библиотеку C++

На C# написана программа, есть там тип данных List<Tuple<double,double,DateTime>>, необходимо это передать во встраиваемую библиотеку С++Kак в С++ именно...

149
взять данные из другого формы через user control (winforms)

взять данные из другого формы через user control (winforms)

Добрый деньЕсть одна форма и user control

142