2014-10-09 2 views
1

У меня есть базовый контроллер:Asp.Net WebApi2 скрывается действие контроллера

public abstract class EntityController<T> : BaseController 
{ 
    public EntityController(ILogService logService) : base(logService) { } 

    [HttpGet] 
    public abstract IEnumerable<T> Get(); 

    [HttpGet] 
    public abstract T Get(int id); 

    [HttpPost] 
    [ValidateModel] 
    public abstract IHttpActionResult Create(T dto); 

    [HttpPut] 
    [ValidateModel] 
    public abstract IHttpActionResult Update(T dto); 

    [HttpDelete] 
    public abstract IHttpActionResult Delete(int id); 
} 

Все отлично работает на большинстве контроллеров наследующих этот класс. Тем не менее, у меня есть несколько контроллеров, в которых я хотел бы «скрыть» действие Get().

Возможно ли это сделать на уровне действия или мне нужно исключить исключение MethodNotFound?

Кроме того, лучше всего использовать все перечисленные выше действия для возврата IHttpActionResult вместо IEnumerable и T?

+0

У меня нет знаний ответить на ваш вопрос, но я нашел это интересным, поэтому я сделал небольшое исследование и придумал [это] (http://stackoverflow.com/questions/106383/c-sharp -Может-публично-наследуемые-методы-быть скрытыми, например, из-частного к производным). Принятый ответ дает хорошее объяснение, поэтому мне тоже понравилось :) Надеюсь, это поможет. –

ответ

1

Этот базовый класс без какой-либо реализации вообще не имеет смысла. Зачем вам это нужно? Если вам нужно абстрагироваться от какого-либо поведения, вам лучше использовать интерфейс. И использование интерфейса дает гораздо большую гибкость. Вы даже можете определить и реализовать различные интерфейсы.

Использование базового класса такого рода имеет смысл, если существует общая реализация, разделяемая всеми наследующими классами. В этом конкретном случае у вас есть параметр типа T, который может позволить вам реализовать и использовать общую реализацию. Это сделало бы этот класс более полезным. Если вы это сделали, вы должны объявить методы как виртуальные, чтобы у вас была возможность изменить реализацию для особых случаев и в противном случае использовать базовую реализацию.

Что касается возврата IHttpActionResult или определенного типа или коллекции, это совершенно естественно и более информативно, когда вы внедряете веб-API. Таким образом, вы должны изменить тип возврата на определенный тип (например, T или набор T), где это имеет смысл.

Вы даже можете объединить идею интерфейса и базовую клазу (с некоторой реализацией). Если вы это сделаете, вы можете иметь базовый класс со всеми функциональными возможностями и набор интерфейсов, что позволит вам выявить только желаемые функции.

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