【问题标题】:Asp.Net WebApi2 hiding controller actionAsp.Net WebApi2 隐藏控制器动作
【发布时间】:2014-10-09 11:50:38
【问题描述】:

我有一个基本控制器:

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 的最佳做法?

【问题讨论】:

  • 我没有知识来回答你的问题,但我觉得它很有趣,所以我做了一些研究并想出了this。接受的答案是一个很好的解释,所以我也喜欢它:) 希望它有所帮助。

标签: c# entity-framework asp.net-web-api


【解决方案1】:

这个没有任何实现的基类是没有意义的。你为什么需要它?如果你需要抽象一些行为,你最好使用接口。使用界面提供了更大的灵活性。您甚至可以定义和实现不同的接口。

如果有一个由所有继承类共享的通用实现,则使用这种基类是有意义的。在这种特殊情况下,您有 T 类型参数,它可以让您实现和共享通用实现。这将使这个类更有用。如果您这样做了,您应该将方法声明为虚拟方法,以便您有机会针对特殊情况更改实现,否则使用基本实现。

至于返回 IHttpActionResult 或特定类型或集合,当您实现 Web API 时,这是非常自然的,而且信息量更大。因此,您应该将返回类型更改为有意义的特定类型(例如 TT 的集合)。

您甚至可以将接口的想法和基类(通过一些实现)结合起来。如果这样做,您可以拥有一个包含所有功能的基类和一组接口,这将允许您只公开所需的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 2023-01-19
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多