Мне пришлось добавить следующую аннотацию к классу конфигурации: @EnableGlobalMethodSecurity(prePostEnabled=true)
Я согласен с Робертом Мунтяну.
В основном вы сворачиваете свою бизнес-логику, которая не присуща вашей модели, на средний уровень. Средний уровень - это бизнес-уровень / бизнес-объекты / уровень бизнес-логики и т. Д., Но он просто называется уровнем услуг. Это не обязательно должен быть веб-сервис, это широкое употребление термина «сервис» в том смысле, что он объединяет функциональные возможности определенной области приложения.
По сути, у вас будет класс CustomerService, содержащий ссылку на репозиторий. Ваш уровень представления будет ссылаться на класс уровня обслуживания.
Существует дополнительное различие, которое можно сделать, исходя из вашего имени, которое вы используете .net и, вероятно, используете LINQ to SQL в качестве репозитория, как указано в NerdDinner.
Репозиторий обычно возвращает IQueryable на уровень сервиса. , позволяя цепочке уровней сервиса объединять несколько запросов для построения различных наборов результатов. Затем Служба оценивает выражение с помощью ToList или другого аналогичного метода и возвращает его на уровень представления.
Поместите его в другой репозиторий (BusinessRuleRepository) и попросите CustomerRepository использовать его.
ИЛИ
Если бизнес-логика ограничивает только результаты, которые может видеть пользователь, вы можете захотеть использовать Выкройка фасада с фабрики. В этом случае у вас будет ICustomerRepository, который обрабатывает ваши CustomerRepository и LimitedCustomerRepository (который может инкапсулировать CustomerRepository), и CustomerRepositoryFactory, который возвращает соответствующий ICustomerRepository для пользователя.