Хобрук: Ваш путь к мастерству в программировании

Заставить контроллер .NET MVC вызывать методы службы, а не напрямую вызывать базовый класс

У меня есть стандартный стек классов в .NET MVC5 с использованием Entity Framework 6:

MyController()
MyService() : ServiceBase()
ServiceBase() : IServiceBase

Все методы/классы на данный момент общедоступны.

ServiceBase() содержит универсальные (T) методы и наследуется всеми службами.

Проблема в том, что MyController() может напрямую вызывать общие методы в ServiceBase(). Важные свойства должны быть установлены в Entity до того, как они будут переданы в ServiceBase().

Есть ли способ скрыть методы ServiceBase() от MyController(), заставляя MyController() проходить через MyService(), а не напрямую вызывать методы ServiceBase()?

Спасибо всем.


  • Есть ли причина, по которой вы не можете сделать эти методы protected? 29.08.2015
  • Когда я делаю их защищенными, я получаю сообщение об ошибке, говорящее о том, что непубличный метод UpdateEntity() не может реализовать метод из интерфейса IServiceBase. И нет никаких настроек доступа к определениям интерфейса. 29.08.2015
  • Опубликуйте код для трех классов. 29.08.2015

Ответы:


1

Почему вы начинаете с интерфейса? Я думаю, что вы немного запутались в своем ОО. Я думаю, что проблема, с которой вы столкнулись, заключается в том, что вы начинаете с интерфейса, в котором нет элементов управления видимостью методов. Итак, вы пытаетесь скрыть это в ServiceBase, но MyService должен знать об интерфейсе, поэтому вы не можете изменить видимость на полпути.

Я бы посоветовал вам немного переосмыслить свою ОО-стратегию.

Однако, если вы действительно хотите сохранить интерфейс и скрыть методы в базовом классе, вы можете убрать их в MyService, а внутри другого метода MyService вы можете напрямую вызвать базовый класс. Я создал пример здесь.

Но, как я уже сказал, я буду препятствовать такому поведению и придумаю лучшую стратегию объектно-ориентированного программирования. Если вы сможете опубликовать свой код, возможно, в отдельном вопросе, то я и остальная часть сообщества смогу помочь вам в этом. К вашему сведению, это может быть лучше на codereview на сайте stackexchange.

22.09.2015

2

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

Сделайте классы ServiceBase абстрактными с помощью защищенного конструктора. Тогда только классы, производные от них, могут получить прямой доступ к своим методам, заставляя контроллер вызывать службу контроллеров, которая затем вызывает базовые классы служб.

Я написал все это в своем блоге здесь

27.09.2015
Новые материалы

Получение стоковых обновлений с помощью Python
Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

Это все, что вам нужно знать о Kotlin в 2022 году
Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

Текстовый графический интерфейс с Lanterna на Java
Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

Основы C# — Нулевой оператор объединения (??)
Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

Сравнение номеров версий в C++ с использованием синтаксического анализа строк
Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

В мир искусственного интеллекта…
ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..