-3

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

我认为这样做的全部意义在于重新利用这些动作,即:从另一个动作(也许ActionResult GetPersons(..))调用 GetPersons。

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

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

重复代码的示例如下:

杰森:

from a in b select new { ... }

不是 json

from a in b

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

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

4

1 回答 1

3

如何在 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);
    }
}
于 2012-09-12T23:36:36.217 回答