2017-11-22 9 views
0

APIのURLを使用せずに別のクラスからアプリケーションAPIコントローラを呼び出す方法はありますか?例えば内部APIコントローラにアクセスする

私はどのように私は、Web要求を使用してに頼ることなく、同じアプリケーション内の別のC#クラスで、このメソッドからJSON結果にアクセスすることができます

public async Task<ActionResult> GetPersonRecord(string id) 
    { 
     Person person; 
     var link = "api/entity/Person/" + id + "?format=json"; 
     string results = await OneIMAction(link); 
     person = JsonConvert.DeserializeObject<Person>(results); 
     string json = JsonConvert.SerializeObject(person, Formatting.Indented); 
     return Content(json, "application/json"); 
    } 

「personContoller」でこの方法がありますか?それは可能ですか?

+3

この実装をサービスの背後に隠し、必要な場所に呼び出す必要があります。 – Fals

+0

何かこの回答が議論しているようなものなのでしょうか? https://stackoverflow.com/questions/14887871/creating-a-service-layer-for-my-mvc-application –

+1

「結果」文字列を逆シリアル化して、もう一度あなたの「人」をシリアル化するのは何ですか? – phuzi

答えて

2

に1つのコントローラを呼び出すことができ、その同じアプリケーション場合は、「すべてのモジュールまたはクラスが提供される機能の一つの部分の上に責任を持つべきですソフトウェアによって」。

APIコントローラから継承するクラスは、Webリクエストに応答する必要があります。 APIコントローラが別のAPIコントローラのアクションにアクセスできるようにするには、Webリクエストを作成し、そのURLを呼び出す必要があります(推奨されません)。タスクを複数のメソッドから呼び出す場合は、クラスサービスと呼ばれるFacadeにタスクを転送します。それを使用したいAPIコントローラのすべてのアクションは、クラスサービスを使用します。

public class TestService 
{ 
    public void Do() 
    { 
     // ... 
    } 
} 


public class HomeController1 : Controller 
{ 
    public ActionResult Index() 
    { 
     var service = new TestService(); 
     service.Do(); 
     return View(); 
    } 
} 


public class HomeController2 : Controller 
{ 
    public ActionResult Index() 
    { 
     var service = new TestService(); 
     service.Do(); 
     return View(); 
    } 
} 
0

たとえ可能であったとしても、コントローラーとアクションはコード内で内部的に呼び出されることはありません。それらはHTTPレスポンスを持つようにも設計されているので、関数を呼び出す場合は、これらのレスポンスを探し、200レスポンスをチェックするtry catchのようなものが必要です。

コードを再利用するには、使用しているコードを別の関数で保持し、コントローラとアクションをそのまま呼び出して関数を呼び出す必要があります。私は通常、ビジネスロジックの中にこのようなことを持っています。

あなたの人のクラスのインスタンスのために

、またはあなたが次のことを持つことができる人のクラスを拡張するクラス:

public static Person GetPerson(string id){ 

} 

あなたは、あなたのコントローラとAPIコントローラでこれを呼び出すことができます。

+0

@Neville悪い考え!あなたはそれをサービスとして分離しておくべきです。クラス内で静的メソッドを作成し、Httpと直列化を結合するのはひどいです。 – Fals

+0

はい静的メソッドは合意した良い考えではありません。私は彼のコンストラクタが達成しようとしていることを完全には確信していませんでした。私は書いたものと書いたものの間のどこかにサンプルコードを表示しようとしていました。 –

0

なぜWebリクエストを使用していますか?あなたはシングル責任原則(SOLIDの第一の原則)によると、別の制御

public class HomeController : Controller 
    { 
     public async Task<ActionResult> GetPersonRecord(string id) 
     { 
      PersonController person =new PersonController(); 
      var Value =person.PersonDetails() 
      Value = JsonConvert.DeserializeObject<Person>(results); 
      string json = JsonConvert.SerializeObject(person, Formatting.Indented); 
      return Content(json, "application/json"); 
     } 
    } 



public class PersonController : Controller 
{ 
    [HTTPPOST] 
    public void PersonDetails (int PersonID) 
    { 
     return XXXX; 
    } 
} 
+0

PersonControllerが私のAPIの一部であるため、無効。私は "タスク"がC#でどのように動作するかを読み上げる必要があると思います。私にとっては新しいコンセプトです(C#と同様)。 –

関連する問題