-3

「Web API」が登場する前は、タイプのアクションを実行する必要がありましたJsonResult GetPersons(..)。さて、Web API を使用すると、List<Person> GetPersons(..).

これの要点は、アクションを再利用すること、つまり、別のアクションから GetPersons を呼び出すことだと思いました (おそらくActionResult GetPersons(..))。

しかし、多くのシリアル化の問題の後、これはオプションではないことがわかりました。たとえば、オブジェクトが内部に列挙型を持っているかのように単純な場合、json にシリアル化することはできません。

そのため、多くのdynamic X(...)匿名型が返されることになり、API の多くのことを実際に再利用することはできません。アニーの提案はありますか?

繰り返されるコードの例は次のとおりです。

ジョンソン:

from a in b select new { ... }

json ではない

from a in b

また、EFオブジェクト自体を返すのは良くないという多くのフォーラムを読んだことがあります.

質問: 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 に答える