2016-07-18 2 views
0

EFとリポジトリを使用して、最初のWeb APIプロジェクトに「GET」リターンステートメントを追加する適切な方法を見つけようとしています。私は数多くの例とチュートリアルに従ってきましたが、それらはすべてWeb APIをセットアップする方法を示していますが、今は追加しようとしています。たとえば、2番目のクラスがある場合、この新しいクラスからすべての値を取得するにはどうすればよいですか?新しいクラスのWebApiチュートリアルにGETリターンを追加する方法

これまでのところ、私は標準的な例をオンラインに従ってきましたが、すべて正常に動作します。 私がこれまで行ってきたことは、2番目のコントローラーを作成し、IRepositoryにメソッド名を追加し、Repository.csに実際のコードを追加することです。

私はこれを正しい方法でやっていることを確認したいだけです。基本的には、私が個々に返すクラスごとにコントローラーを追加し続けるだけで、私のリポジトリを長く長くし続けるのですか?それはこれを行う正しい方法ですか? (チュートリアルに基づく)

第1コントローラ

public class ClientController : ApiController 
{ 
    private IRepository _repo; 

    public ClientController(IRepository repo) 
    { 
     _repo = repo; 
    } 

    public IQueryable<Client> Get() 
    { 
     return _repo.GetAllClients(); 
    } 

    public IQueryable<Client> Get(bool includeDetails) 
    { 
     IQueryable<Client> query; 

     if (includeDetails) 
     { 
      query = _repo.GetAllClientsWithDetails(); 
     } 
     else 
     { 
      query = _repo.GetAllClients(); 
     } 

     return query; 
    } 

    public Client Get(int id) 
    { 
     return _repo.GetClient(id); 
    } 

} 

IREPOSITORY

public interface IRepository 
{ 
    IQueryable<Client> GetAllClients(); 
    IQueryable<Client> GetAllClientsWithDetails(); 
    Client GetClient(int id); 

    IQueryable<Trade> GetAllTrades(); 
    Trade GetTrade(int id); 
} 

リポジトリ

public class Repository : IRepository 
{ 
    private xxxxV002Context db;   

    public Repository(xxxxV002Context db) 
    { 
     this.db = db; 
    } 

    //------------------------------------------------------------------------ 

    public IQueryable<Client> GetAllClients() 
    { 
     return db.Clients; 
    } 

    public IQueryable<Client> GetAllClientsWithDetails() 
    { 
     return db.Clients.Include("Mapping_ClientAccount"); 
    } 

    public Client GetClient(int id) 
    {    
     return db.Clients.Include("Mapping_ClientAccount.Account").FirstOrDefault(o => o.ClientID == id); 
    } 

    //----------------------------------------------------------------------- 

    public IQueryable<Trade> GetAllTrades() 
    { 
     return db.Trades; 
    } 

    public Trade GetTrade(int id) 
    { 
     return db.Trades.FirstOrDefault(x => x.TradeID == id); 
    } 

} 

前記第二のコントローラ(NEW)

public class TradeController : ApiController 
{ 
    private IRepository _repo; 

    public TradeController(IRepository repo) 
    { 
     _repo = repo; 
    } 

    // GET api/<controller> 
    public IQueryable<Trade> Get() 
    { 
     return _repo.GetAllTrades(); 
    } 

    // GET api/<controller>/5 
    public Trade Get(int id) 
    { 
     return _repo.GetTrade(id); 
    } 

    // POST api/<controller> 
    public void Post([FromBody]string value) 
    { 
    } 

    // PUT api/<controller>/5 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    // DELETE api/<controller>/5 
    public void Delete(int id) 
    { 
    } 
} 

これをテストと同じようにClientControllerに追加し、Routesを使用して別のクラスのデータを正常に返しました。だから私は複数のコントローラを持つ必要がありますか、または私はちょうど1つのコントローラに多くのメソッドを置くことができますか?ベストプラクティスとは何ですか?

public class ClientController : ApiController 
{ 
    private IRepository _repo; 

    public ClientController(IRepository repo) 
    { 
     _repo = repo; 
    } 

    public IQueryable<Client> Get() 
    { 
     return _repo.GetAllClients(); 
    } 

    public IQueryable<Client> Get(bool includeDetails) 
    { 
     IQueryable<Client> query; 

     if (includeDetails) 
     { 
      query = _repo.GetAllClientsWithDetails(); 
     } 
     else 
     { 
      query = _repo.GetAllClients(); 
     } 

     return query; 
    } 

    public Client Get(int id) 
    { 
     return _repo.GetClient(id); 
    } 

    [Route("api/client/{customerId}/orders")] 
    [HttpGet] 
    public Trade GetOrdersByCustomer(int customerId) 
    { 
     xxxxContext db = new xxxxContext(); 
     var x1 = db.Trades.FirstOrDefault(x => x.TradeID == customerId) as xxxx.Models.Trade; 
     return x1; 
    } 


} 
+0

コードの一部を表示して、これまで行ってきたことを確認できますか? – MichaelDotKnox

+0

はい、私は – solarissf

答えて

1

私は@LoekDが言ったことをエコーし​​ますが、慣習に頼るのではなく、あなたのメソッドにhttp動詞の属性を入れることをお勧めします。コントローラーが大きくなり、物事をより一貫性のあるものにするならば、物事がより明確になります。この方法で例えば

、:

public IQueryable<Client> Get(bool includeDetails) 

それを作る:

[HttpGet] 
public IQueryable<Client> Get(bool includeDetails) 

必要ははありませんが、それは将来的にあなたの時間を節約します。

リポジトリの場合は、実際には特定のタイプのみを返す必要があります。上のコードに基づいて、Clientオブジェクト用のリポジトリとTradeオブジェクト用の別のリポジトリが必要です。

それ以外は、あなたは正しい道にいると思います。

+0

ありがとう...私は属性タグ[HTTPGET]を追加し、元の投稿の最後に新しいサンプルを配置しました。複数のコントローラーを持っていても、元のコントローラーをルートを使って長くしておくだけでいいですか? – solarissf

+0

最後の質問ですが、複数のリポジトリを持つ目的は何ですか?ただ持っている方が簡単ではないでしょうか? – solarissf

+0

あなたのコントローラはリポジトリと同じように1つのタイプを扱う必要があります。それはすべて[Single Responsibility Principle](https://en.wikipedia.org/wiki/Single_responsibility_principle)にあります。あなたのクラスは1つのことだけを行うべきです。あなたのケースでは、クライアントと取引。データベースからのクライアントデータの取得を処理するすべてのコードがClientRepositoryにあることがわかっている場合は、コードを読み返すことが簡単になります。 – MichaelDotKnox

1

ルーティング機能を使用して、APIでサポートされているGET操作とその処理に必要なパラメータを指定できます。例えば

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

お名前またはIDでUserを取得したい場合、それは次のようになります。

[Route("users/{id:int}"] 
public User GetUserById(int id) { ... } 

[Route("users/{name}"] 
public User GetUserByName(string name) { ... } 

Route属性は、あなたのアクションに配置されます)

+0

の上にコードを追加しました。あなたのチュートリアルを使用して、ちょうど私がこれをClientController(上の例)に追加して、ルートを使用して別のクラスのデータを返しました。だから私は複数のコントローラを持つ必要がありますか、または私はちょうど1つのコントローラに多くのメソッドを置くことができますか?ベストプラクティスとは何ですか? – solarissf

関連する問題