У Марка Симана в его книге 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. Во входных параметрах метода не будет передан пользователь.Если читать рекомендации по архитектуре, то помимо ответственностей, которые относятся к одному конкретному слою - выделяются ещё и ответственности, которые "пронизывают все слои приложения" (логирование и та же авторизация).
Здесь такой же случай: непонятно, нужно ли подобные проверки делать только на уровне бизнес-логики или нужно дублировать и в слое приложения?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
На C# написана программа, есть там тип данных List<Tuple<double,double,DateTime>>, необходимо это передать во встраиваемую библиотеку С++Kак в С++ именно...
Добрый деньЕсть одна форма и user control