2012-09-12 40 views
-3

在出現「web api」之前,必須執行類型爲JsonResult GetPersons(..)的操作。現在,使用web api,可以有List<Person> GetPersons(..)ASP.NET MVC Web Api重用利用

我認爲這是爲了重新利用這些操作,即:從另一個操作(可能是ActionResult GetPersons(..))調用GetPersons。

但很多序列化問題後,我發現這不是一個選項。例如,就像對象內部有枚舉一樣簡單,它不能被序列化爲json。

所以我結束了很多dynamic X(...)返回匿名類型,我真的不能重用我的API的很多東西。 Anny的建議?

的重複代碼例子是以下幾點:

JSON:

from a in b select new { ... }

不JSON

from a in b

而且,我讀過很多論壇,對於返回EF對象本身並不好,這正是web api所激發的(以及[Scr iptIgnore])

問題:如何在API和正常控制器中重用查詢?

+0

問題是? –

+1

理由是這不是一個問題。 – Ademar

+0

你的問題是什麼? –

回答

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); 
    } 
}