【问题标题】:Web API without using ApiController不使用 ApiController 的 Web API
【发布时间】:2012-07-17 07:06:14
【问题描述】:

我想使用新的 MS Web API 而不必从 ApiController 继承

理想情况下,我想创建单独的类,只处理一个 HTTP 方法和路由。例如:

// Handles GET /customer/1
public class GetCustomerHandler
{
    public object Handle(int id)
    {
        return ...;
    }
}

// Handles PUT /customer/1
public class PutCustomerHandler
{
    public object Handle(NewCustomerForm form)
    {
        return ...;
    }
}

我想System.Web.Http 有很多扩展点来允许这种方法,但我找不到合适的文档。有人能指出我正确的方向吗?

【问题讨论】:

  • 这不是使用 ApiController 的预期方法。有特别的理由这样做吗?你总是可以在你的主控制器中调用其他类,这样行吗?#
  • 我正在尝试对我的代码采用更严格的 SRP 方法。处理获取数据的代码与更新数据的代码完全不同,所以我不明白为什么它们应该在同一个类中。

标签: asp.net asp.net-web-api wcf-web-api


【解决方案1】:

这不是使用ApiController 的预期方法。

我建议,如果您需要这样做,您可以在正常路由/操作选择的基础上构建它。我的意思是你可以有一个控制器来调用其他类来实现这种实现。下面是一个使用函数式方法的原型:

public abstract class HubController<T>
{

    private Func<int, object> _getHandler;
    private Func<T, object> _putHandler;

    public HubController(Func<int, object> getHandler, Func<T, object> putHandler
        // ... delete and post handlers too
        )
    {
        _putHandler = putHandler;
        _getHandler = getHandler;
    }

    public object Get(int id)
    {
        return _getHandler(id);
    }

    public object Put(T t)
    {
        return _putHandler(t);
    }

    // ... also Post and Delete
}

public class CustomerControler : HubController<Customer>
{
    public CustomerControler(Func<int, object> getHandler, Func<Customer, object> putHandler) : base(getHandler, putHandler)
    {
    }
}

委托可以只是委托或接口的实现,尽管我更喜欢委托,因为“单一方法的接口是委托”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 2014-07-07
    • 1970-01-01
    • 2013-08-04
    • 2012-03-14
    • 2012-03-22
    • 2017-07-10
    • 1970-01-01
    相关资源
    最近更新 更多