【问题标题】:ASP.NET MVC Web Api reutilizationASP.NET MVC Web Api 重用
【发布时间】:2012-09-05 16:41:16
【问题描述】:

在“web api”出现之前,必须执行JsonResult GetPersons(..) 类型的操作。现在,使用 web api,可以拥有List<Person> GetPersons(..)

我认为这样做的重点是重新利用动作,即:从另一个动作调用 GetPersons(可能是ActionResult GetPersons(..))。

但在许多序列化问题之后,我发现这不是一个选项。比如对象里面有枚举这么简单,是不能序列化成json的。

所以我最终得到了许多 dynamic X(...) 返回匿名类型,我不能真正重用我的 API 的很多东西。有什么建议吗?

重复代码示例如下:

json:

from a in b select new { ... }

不是json

from a in b

另外,我在许多论坛上读到返回 EF 对象本身并不好,而这正是 web api 的动机(以及 [ScriptIgnore] 的存在)

问题:如何在 API 和普通控制器中重用查询?

【问题讨论】:

  • 理由不是问题。
  • WebAPI 不会“激励”您使用 EF 或任何其他类型的实体。您看到的示例经常这样做,因为 MS 以这种方式显示它会更快,并且因为它们希望您对 EF 有一个硬依赖。但是,您不必返回实体模型。您可以返回 ViewModel、EditModel,甚至是专门的 API 特定模型。

标签: c# .net asp.net-mvc-4 asp.net-web-api


【解决方案1】:

如何在 API 和普通控制器中重用查询?

通过不在 API 或 MVC 控制器中定义查询。您可以在 MVC 项目外部的共享程序集中定义查询,并让控制器调用该层。

例子:

外化

public interface IQuery<TResult> {}

public interface IQueryProcessor
{
    TResult Execute<TResult>(IQuery<TResult> query)
}

public class MyQueryObject : IQuery<MyEntity[]>
{
    public string QueryParam1 { get; set; }
    public int QueryParam2 { get; set; }
}

API 控制器

public class MyApiController : ApiController
{
    private readonly IQueryProcessor _queryProcessor;

    public MyApiController(IQueryProcessor queryProcessor)
    {
        _queryProcessor = queryProcessor
    }

    public IEnumerable<MyApiModel> Get
        ([FromUri] string queryParam1, int queryParam2)
    {
        var query = new MyQueryObject
        {
            QueryParam1 = queryParam1,
            QueryParam2 = queryParam2,
        };
        var results = _queryProcessor.Execute(query);
        return Mapper.Map<IEnumerable<MyApiModel>>(results);
    }
}

MVC 控制器

public class MyMvcController : Controller
{
    private readonly IQueryProcessor _queryProcessor;

    public MyMvcController(IQueryProcessor queryProcessor)
    {
        _queryProcessor = queryProcessor
    }

    public ViewResult Index(string queryParam1, int queryParam2)
    {
        var query = new MyQueryObject
        {
            QueryParam1 = queryParam1,
            QueryParam2 = queryParam2,
        };
        var results = _queryProcessor.Execute(query);
        var models = Mapper.Map<IEnumerable<MyViewModel>>(results);
        return View(models);
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多