2017-03-17 5 views
0

私はゲームサーバーをホストするアプリケーションを構築しており、外部コントロール用のWeb APIを追加したいと考えています。アプリケーションは現在、コンソールアプリケーションですが、最終的にはWindowsサービスになります。私はWeb APIを追加し、リクエストに応答することができます。また、TcpServerをコンソールアプリケーションに、TcpClientをWeb APIに追加して、Web APIがコンソールアプリケーションにコマンドを送信できるようにしました。ウェブAPIを通じてサービスのやりとりを許可する方法

しかし、Web APIはゲームサーバーをホストする同じコンソールアプリケーションでホストされているため、Web APIコントローラクラスからゲームサーバーのホストクラスに直接コマンドを送信できる方法はありますか?それは現在この(スペースを節約するために省略し、共通のTCPコード)のようになります。

public class GameServiceManager 
{ 
    private IDisposable _restApi; 
    GameServer _gameServer; 

    public void StartService(NameValueCollection appSettings) 
    { 
     _restApi = WebApp.Start<MyHttpHostController>(url: restApiUrl); 
     _gameServer = new GameServer(); 
     // also starts TCP Server stuff to receive command 
    } 
} 

public class MyHttpHostController 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{action}/{id}", 
      defaults: new { controller = "RestApi", id = RouteParameter.Optional } 
     ); 

     appBuilder.UseWebApi(config); 
    } 
} 

public class RestApiController : ApiController 
{ 
    [HttpGet] 
    public IHttpActionResult resetGameServer() 
    { 
     // creates TCP Client to send command 
     return Ok(); 
    } 
} 

GameServiceManagerはコンソールアプリでインスタンス化し、その後をStartService()を呼び出しています。他のアプリケーションでは、イベントを使用して親クラスと子クラスの間でコマンドをやりとりしましたが、Web APIの部分をあまり支配していないようです。

+0

からcode samplesは、あなたのWeb APIからの静的およびアクセスそれとしてあなたのゲームサーバは、あなたが持つことができていますか? – StfBln

+0

私はそう信じませんが、わかりません。いくつかの子プロセスを追跡し、他の2つの外部API間の同期を維持する必要があります。 – Cam

+0

名前付きパイプを使って通信を調べましたか? – NPhillips

答えて

1

GameServiceManagerクラスを静的にすることができない場合は、他の誰かが示唆しているように、シングルトンパターンを適用することができます。

public class GameServiceManager 
{ 
    public static GameServiceManager Instance { get; protected set; } 

    public GameServiceManager() 
    { 
    if (GameServiceManager.Instance != null) 
     throw new Exception("singleton has already been created"); 

    GameServiceManager.Instance = this; 
    } 
} 

さて、どこでもあなたのコードの残りの部分では、あなたは簡単に正常に動作静的プロパティGameServiceManager.Instance

+0

これはとても面白いです!それは時間がかかるだろうが、私はそれをテストします、ありがとう! – Cam

+0

インスタンスをpublicにするのではなく、プライベートインスタンスを利用するいくつかのpublic static関数を作成しました。素晴らしい仕事、ありがとう! – Cam

+0

「保護されたセット」は、外部コードがインスタンスを何か他のものに設定するのを妨げてしまったので、おそらくあなたがheheを実装したのと同じ結果になると思います。これがあなたを助けてくれてうれしい! –

0

私が使用しているSignalRのパブやサブを使用してGameServiceManagerオブジェクトへの参照を取得することができますウェブインターフェースも同様です。私はすでにPrismでEventAgregatorを使っている経験があり、私は自分のWeb APIで同じものを実装しようとしていて、EventAggregator Proxy Signal R By Andersを見つけました。上記の記事に基づいて私はあなたを助けるかもしれない速いHelloWorldアプリケーションをやった。このパターンはWeb、Web API、Windowsアプリケーション間で動作します。

ここAnders

[HttpPost] 
    [Route("GenericEvent")] 
    public void GenericEvent([FromBody] string text) 
    { 
     eventAggregator.Publish(new GenericEvent<string>(text)); 
    } 
関連する問題