2015年3月2日月曜日

Nancy入門 install~Hello Worldまで

1.拡張機能のインストール
[ツール]⇢[拡張機能と更新プログラム]で[Nancy]をインストールしてVisualStudioを再起動する。


2.環境設定
管理者権限で起動したDosプロンプトで下記コマンドを実行。
  netsh http add urlacl url=http://+:3579/ user=ユーザー名

3.プロジェクト作成
 プロジェクト作成⇢C#⇢Web⇢Nancy SelfHosting を選択。

最初エラーがでるが、プロジェクトを保存してビルド&実行すると
初回のみNugetがNancyをダウンロード、その後実行開始する。


4.動作確認
 ブラウザでhttp://localhost:3579/ にアクセスする。

Nancy画像が表示されれば成功。


~~~~~~ここからNancyフレームワークを読み解く~~~~~~

ソリューションエクスプローラーのフォルダ構成

・NancyApplication1
⇢Content       メディアファイル
 nancy-logo.png
⇢Views         テンプレート(Html)
 index.sshtml
Bootstrapper.cs    よくわかってない https://github.com/NancyFx/Nancy/wiki/Bootstrapper
IndexModule.cs    ルーター機能搭載したコントローラー部
Programs.cs      セルフサーバーを起動するメイン関数


個々の説明

Content/Views
 コンテンツとテンプレート部分は、様々なテンプレートエンジンが用意されてるのでそれを利用するか、HTML5なページをそのまま構築していくかは自由。

IndexModule.cs
 djangoでいうurls.py、views.pyを併せ持つ存在。

NancyModule
 ベースクラス内部がシングルトンになっているのかな。コンストラクタ内部でURLメソッドの定義を行っておくと、すべてがリンクする仕組み。つまり粒度を最小単位1ページ1クラスというような構成にしてもNancyModuleを継承さえすればrouter周りの事は初回コンストラクタ生成時に自動でやってくれる。

Programs.cs
 ここは特に弄る必要はなさそうだ。


ここまでをまとめると、WEBページがアクセスされたらPrograms.csで宣言したセルフサーバーが受けて、NancyModuleを継承してるクラスを総当りで検索して該当するURLのアクションを呼び出す。



その次、
該当するNancyModuleを継承したクラスが呼び出されたら何ができるかというのは
NancyModuleのメタデータの中身を見なくてはいけなくて、

        public AfterPipeline After { get; set; }
        public BeforePipeline Before { get; set; }
        public NancyContext Context { get; set; }
        public NancyModule.RouteBuilder Delete { get; }
        public NancyModule.RouteBuilder Get { get; }
        public IModelBinderLocator ModelBinderLocator { get; set; }
        public virtual ModelValidationResult ModelValidationResult { get; set; }
        public string ModulePath { get; }
        public Negotiator Negotiate { get; }
        public ErrorPipeline OnError { get; set; }
        public NancyModule.RouteBuilder Options { get; }
        public NancyModule.RouteBuilder Patch { get; }
        public NancyModule.RouteBuilder Post { get; }
        public NancyModule.RouteBuilder Put { get; }
        public virtual Request Request { get; set; }
        public IResponseFormatter Response { get; set; }
        public virtual IEnumerable Routes { get; }
        public ISession Session { get; }
        public IModelValidatorLocator ValidatorLocator { get; set; }
        public NancyModule.ViewRenderer View { get; }
        public dynamic ViewBag { get; }
        public IViewFactory ViewFactory { get; set; }
        public class RouteBuilder : IHideObjectMembers
        public class ViewRenderer : IHideObjectMembers

うーむ、沢山あって良くわからない。が、目星だけつけておくと

茶色がRequest :入力
赤字がURLメソッド :処理
青字がページデータ :出力

基本的な実装作法は見えた気がする。
該当URLのメソッドが呼び出され、引数はRequestで受け取ってビジネスロジックが動作した後Viewでテンプレート呼び出し。

まとめると、
・公式ページにNancyは超軽量フレームワークっていうのは本当ぽい。
・新規プロジェクトを作ったらセルフサーバーが出来上がる。
・Moduleは沢山あっても良い。
・新規ページを追加するときはルートを気にせずに新規クラスを作るだけの軽い感覚で。
・ページレイアウトは自分の使いやすいものが使える。
・初見でNancyはURLのルーティグしかやってないでしょってくらいな軽量具合。
・DBは自前で用意しないといけないのかって思うと気が重くなる。
・Djangoを知ってると管理ページもついてくるDjangoがいいって騒ぎたくなる。
・最後にC#でかけるから実行速度に期待できそうなのでよしとする。


コメントを投稿

Androider