突然、NancyFXフレームワークと、その助けを借りて作成された.NETプラットフォームのマイクロサービスにまったく興味がない場合は、恐竜について読んでください!
私たちのオフィスは何かと混同することはできません-膨脹可能な恐竜がここにインストールされており、経験豊富なモニターの公園全体があり、チーム全体が絶えずヨークシャー茶を追いかけています。 しかし、彼が確かにふさわしいような生命を与える餌に時間を割くには、主なタスクを迅速かつ効率的に解決する必要があります。特に、顧客がホテルの部屋を予約できるサービスをサポートする必要があります。
これをさらに改善するために、 マイクロサービスアーキテクチャのコードベースセグメントを徐々に再設計しました。 まず、API Reservationsを作成し、独立したバージョン管理、リリース、およびメンテナンスシステムを備えた別のドメインで予約レコードを作成および取得することに関連するすべての機能を強調しました。 そのため、Node.jsに基づいたモバイルバージョンや予約フォームなど、新しいクロスプラットフォームフロントエンドを簡単にサポートできました。
しかし、さらに先に進み、確認がフロントエンドに返される前に厳密に実行する必要のない予約の段階(確認付きのメッセージ送信など)を強調しました。 予約プロセス自体は、アクションの2つのセットに減らすことができます。ホテルルームを予約し、対応するレコードを保存します。その後、両方の操作ができるだけ早く完了することが確認できます。 これを行うために、ツールキットにメッセージキューを追加し、このような帯域外タスクを処理するために特別に設計された一連のコマンドおよびイベントプロセッサを使用しました。
間もなく、一連のサービスが必要になりました。各サービスは、ドメインの特定の部分を担当していました。 それらを開発するために、できればスリップすることなく、REST APIを迅速かつ簡単に作成する必要がありました。 そして、ナンシーを見つけました。
NancyFxは、.NET用のすばらしい軽量Webフレームワークです。 SinatraやExpressなど、他の言語のフレームワークでガイドされている場合、それから何を期待するかをすでに想像しているでしょう。 一方、Microsoft MVCやWCFのような.NETブロックのみに精通している場合は、おそらく、嬉しい驚きが待っています。
ナンシーの賞賛を歌う代わりに(私は何時間でもできます)、カブを使ってナンシーで15分以内に簡単なRESTエンドポイントを作成するのがどれほど簡単かをお見せします。
ステップ1:C#コンソールアプリケーションを作成する
もちろん、これは.NETプラットフォームの別の言語で実行できます。 VBでも。
ステップ2:ナンシーをインポートする
NancyはNugetパッケージの形式で提供されるため、プロジェクトにバイナリをインポートしてリンクするための最も便利なツールであるVisual Studioパッケージマネージャーを使用することをお勧めします。 この場合、メインのNancyパッケージに応じて、
Nancy.Hosting.Self
パッケージが必要です。
ステップ3:ナンシーホストを作成する
Main
メソッド(または同等のプログラムエントリポイント)に次を記述します。
using (var host = new NancyHost(new Uri("http://localhost:1234")) { Console.ReadKey(); }
ポート1234でHTTPをリッスンするコンソールアプリケーションを既に作成しました。実際、これを行いたいのは、外部HTTP要求を管理対象プロセスに送信するリバースプロキシの単純な実装です。 ただし、Nancyは従来のIISホスティングであるOWINもサポートしています。
ステップ4:リソースへのルートを作成する
Nancyから
Module
クラスを継承して、最初のルートを作成します。 これを新しいプロジェクトのファイルに書き込みます。
class Dinosaur { public string Name { get; set; } public int HeightInFeet { get; set; } public string Status { get; set; } } class DinosaurModule : NancyModule { private static Dinosaur dinosaur = new Dinosaur() { Name = "Kierkegaard", HeightInFeet = 0, Status = "Deflated" }; public DinosaurModule() { Get["/dinosaur"] = parameters => dinosaur; } }
ホストが起動すると、Nancyはアセンブリをスキャンし、その中の
NancyModule
を継承するクラスを探します。 それらは、リクエストが受信されるたびにインスタンス化され、ルーティングとアクションを提供します。 この場合、モジュールコンストラクターで単純なGETルートを作成し、ラムダ式を使用して、定義したモデルオブジェクトを返します。 コンテンツタイプのヘッダーなしでlocalhost :1234 / dinosaurを呼び出すと、恐竜モデルがJSON形式で送信されます。 アプリケーションを起動してみてください。
ステップ5:書き込み操作を追加する
これまでのところ、リソースは読み取り専用です。
DinosaurModule
コンストラクターに次のコードを追加します。
Post["/dinosaur"] = parameters => { var model = this.Bind<Dinosaur>(); dinosaur = model; return model; };
バインディングはHTTPリクエストのボディを取得し、指定されたモデルタイプに関連付けようとします。 次のコードをlocalhostに送信してみてください:1234 / dinosaur、コンテンツタイプはapplication / jsonです。
{ "name": "Kierkegaard", "heightInFeet": 6, "status": "Inflated" }
リクエストの本文は
Dinosaur
クラスにバインドされ、静的な
Dinosaur
メンバーに割り当てられる必要があります。
Get
エンドポイントと同様に、モデルを返します。その後、NancyはJSONモデルをシリアル化します。 ナンシーにはコンテンツディスカッションやプレゼンテーションレンダリングなどの機能がありますが、このデモではデフォルトの動作で問題ありません。
ステップ6:インデックス付きリソースを作成して返す
原則として、REST APIを記述するとき、各リソースからいくつか必要になります。 クラスを少し変更しましょう:
public class DinosaurModule : NancyModule { private static List<Dinosaur> dinosaurs = new List<Dinosaur>() { new Dinosaur() { Name = "Kierkegaard", HeightInFeet = 6, Status = "Inflated" } }; public DinosaurModule() { Get["/dinosaurs/{id}"] = parameters => dinosaurs[parameters.id - 1]; Post["/dinosaurs"] = parameters => { var model = this.Bind<Dinosaur>(); dinosaurs.Add(model); return dinosaurs.Count.ToString(); }; } }
現在のルートは
/dinosaurs
です。 ラムダ式の
parameters
オブジェクトは、本質的に、ルート、クエリ文字列、およびクエリ本文からの値を結合する動的な型です。 ルート内で
{id}
パラメーターを定義することで、それをキャプチャし、それを使用して必要なリソースを取得できます。
送信ルートに沿って、引き続き恐竜を投稿してコレクションに追加できます。 このデモでは、作成したリソースのインデックスを応答の本文の文字列として単純に返します。 ユーザーが簡単にアクセスできるように、ナビゲーションリンクを新しいリソースに戻すことをお勧めします。
ステップ7:あなたの動き
観光ツアーのフィナーレでは、このようなスパルタンのエンドRESTポイントを獲得しました。 次は? 当然、メモリではなく、何らかの長期データウェアハウスにリソースを保持したいのですが、検証、エラー処理、セキュリティはどうでしょうか?
簡単でシンプルなNancyは、箱から出してすぐにこれらの問題の多くを解決し、プロジェクトに簡単に実装できる他の機能を提供します。
だから、ナンシーの一般的なアイデアを作りました-そして今ドキュメントを読んでください。