Castleproject MonoRail:基本

こんにちは、Habr! ここで、Monorailのようなすばらしい.NET MVCフレームワークがどうにかしてバイパスされていることに気付きました。 したがって、実際、このギャップを埋めようとします。 はじめに、基本に触れることは理にかなっています。プロジェクトテンプレートと最も単純な例を作成して、すべてがどのように機能するかを確認します。



さあ、行こう! これは私の最初の記事であり、したがっていくつかの欠陥は完全に受け入れられることを警告したいだけです。 建設的な批判を聞いてうれしいです。



バイナリファイルはこちらからダウンロードできます: sourceforge.net/projects/castleproject/files/MonoRail/2.0/Castle.MonoRail-2.0.0.zip/download

当然、アーカイブにあるすべてのdllは必要ありません。最も必要なものだけを使用します。



プロジェクトを作成します。



初期プロジェクトを作成するには、コードを直接作成する準備ができている2つの方法があります。VS用テンプレートと実際のペンを使用する方法です。



私の知る限り、最初の方法は、Castleプロジェクトが別のMSIファイルとして配布されるのをやめた後、その関連性を失いました。 これでテンプレートを使用できますが、アセンブリへのリンクはそれらへのパスで中断する必要があります。 念のため、VS2008の完成したテストプロジェクトテンプレートへのリンクを次に示します。tech.wowkhmer.com/ wp- content/ uploads / 2008/ 11/ CastleMonoRailProject.zip 確かに、私自身はMonorailのテンプレートを使用していないため、完全に機能することを保証できません。



前述の理由から、2番目の方法でプロジェクトを作成する方法について詳しく説明します。



手順1.新しいASP.NETアプリケーションを作成します。


この空のプロジェクトでは、Default.aspxは必要ありません。 しかし、急いで削除しないでください。 ブラウザ行にwww.mysite.comを入力したときにメインページmysite.com/home/index.railsにリダイレクトされるようにするには、このファイルが役立ちます。 デザイナと.csファイルは削除され、default.aspx自体はどこかにこの形式に縮小されます。



 <%@ Page Language="C#" %> <script runat="server"> protected override void OnLoad(EventArgs e) { Response.Redirect("~/home/index.rails"); base.OnLoad(e); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Welcome</title> </head> <body> <p> If you were not redirected, please <a href="home/index.rails">click here</a>. </p> </body> </html> 
      





<%@ Page Language="C#" %> <script runat="server"> protected override void OnLoad(EventArgs e) { Response.Redirect("~/home/index.rails"); base.OnLoad(e); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Welcome</title> </head> <body> <p> If you were not redirected, please <a href="home/index.rails">click here</a>. </p> </body> </html>







ここで、home / index.railsは、実際にはサイトのメインページへのパスです。 当然、レールの解像度は変更できますが、例ではそれを使用します。



ステップ2:設定


ダウンロードしたものから次のビルドを追加します。



モノレールではこれに制限はありませんが、ビューをレンダリングするエンジンとしてNVelocityを使用します。さらに、たとえば、Brailなどの他のエンジンが直接付属しています。 私はBrailとNVelocityを使用しましたが、2番目のBrailが好きでした。さらに、当時のBrailはまだサポートが弱く、多くのものが実装されていませんでした。 今の状況はわかりませんが、喜んで聞きます。



web.configに変更を加えます。 私のプロジェクトでは、次のようなことが判明しました。



 <?xml version="1.0" encoding="UTF-8"?> <configuration> <configSections> <section name="monorail" type="Castle.MonoRail.Framework.Configuration.MonoRailSectionHandler, Castle.MonoRail.Framework" /> </configSections> <monorail> <controllers> <assembly>TestMonorailApp</assembly> </controllers> <viewEngines viewPathRoot="Views"> <add type="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity" /> </viewEngines> </monorail> <system.web> <compilation debug="true" /> <httpHandlers> <add verb="*" path="*.rails" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" /> <add verb="*" path="*.vm" type="System.Web.HttpForbiddenHandler" /> </httpHandlers> </system.web> </configuration> 
      





<?xml version="1.0" encoding="UTF-8"?> <configuration> <configSections> <section name="monorail" type="Castle.MonoRail.Framework.Configuration.MonoRailSectionHandler, Castle.MonoRail.Framework" /> </configSections> <monorail> <controllers> <assembly>TestMonorailApp</assembly> </controllers> <viewEngines viewPathRoot="Views"> <add type="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity" /> </viewEngines> </monorail> <system.web> <compilation debug="true" /> <httpHandlers> <add verb="*" path="*.rails" type="Castle.MonoRail.Framework.MonoRailHttpHandlerFactory, Castle.MonoRail.Framework" /> <add verb="*" path="*.vm" type="System.Web.HttpForbiddenHandler" /> </httpHandlers> </system.web> </configuration>







最初に、モノレールセクションが登録されます。 その中に、アプリケーションのコントローラーをロードする場所を示します。 私の例は単純なので、コントローラーは同じアセンブリにあり、それに応じて名前が示されています。 さらに同じセクションで、レンダリング用にエンジンを登録し、ビューカタログのツリーのルートを指定します(この場合は「ビュー」です)。 最後に、選択した拡張機能(レール)にハンドラーを追加し、vmファイルへのアクセスを禁止します(この拡張機能はNVelocityテンプレートに使用され、外部からはアクセスできません)。



ステップ3.フォルダー構造を作成するためだけに残ります。


図のように持っています。



フォルダー構造



プロジェクトテンプレートが作成されました!



最も単純な機能を追加する



私たちはプロジェクトを作成しましたが、他に何も機能しない場合は何が楽しいでしょうか?

たとえば、本をリストするコントローラーを作成しましょう。

これを行うには、Modelsフォルダーに配置するBookモデルが必要です。 当然、実際のプロジェクトでは、モジュールは個別のアセンブリに含まれますが、単純な例には含まれません。 Bookクラスの実装は次のとおりです。



 public class Book { public String Title { get; set; } public String Author { get; set; } public static IList<Book> FindAll() { return new List<Book> { new Book { Title = "Alice in Wonderland", Author = "Lewis Carroll" }, new Book { Title = "Pinocchio", Author = "Carlo Collodi" }, new Book { Title = "I, Robot", Author = "Isaac Asimov" } }; } } 
      





public class Book { public String Title { get; set; } public String Author { get; set; } public static IList<Book> FindAll() { return new List<Book> { new Book { Title = "Alice in Wonderland", Author = "Lewis Carroll" }, new Book { Title = "Pinocchio", Author = "Carlo Collodi" }, new Book { Title = "I, Robot", Author = "Isaac Asimov" } }; } }







FindAllメソッドは、テストケースで使用する3つの書籍のコレクションを返すだけです。

次に、コントローラーを作成します。 deafult.aspxのデフォルトパスをhome / index.railsとして指定したため、このページに書籍のリストを投稿します。

したがって、Controllersフォルダーに、モノレールの一部であるSmartDispatcherControllerを継承するHomeControllerを作成します。 厳密に言えば、この例ではバインダーを使用しないため、この例ではControllerから継承することもできますが、実際のプロジェクトではSmartDispatcherController機能が非常に頻繁に必要になります。

そこで、ブラウザでmysite.com/home/index.railsを入力すると呼び出されるIndexメソッドを作成します。 クラスの実装の形式は次のとおりです。



 public class HomeController : SmartDispatcherController { public void Index() { PropertyBag["books"] = Book.FindAll(); } } 
      





public class HomeController : SmartDispatcherController { public void Index() { PropertyBag["books"] = Book.FindAll(); } }







ここでは、Viewで使用可能なコンテナにすべての書籍をロードします。 これは、すべてのロジックがモデル内にあり、コントローラーがビューとモデルの間でデータを転送することのみを担当する場合の、スキニーコントローラー/ファットモデルの精神と一致しています。



htmlコード自体を作成することは残っています。 ビューフォルダーとホームサブフォルダーに配置します。 したがって、ビューが属するコントローラーに応じてビューを区別します。 そこで、以下を含むindex.vmファイルを作成します。



 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test Application</title> </head> <body> <h3>List of books:</h3> #foreach($book in $books) #each <li> $book.Title by $book.Author </li> #beforeall <ul> #afterall </ul> #end </body> 
      





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Test Application</title> </head> <body> <h3>List of books:</h3> #foreach($book in $books) #each <li> $book.Title by $book.Author </li> #beforeall <ul> #afterall </ul> #end </body>







ここでは、foreachマクロを使用して、書籍のコレクションをウォークスルーします。 ここで通常の変数として使用できます。 つまり、コントローラーのPropertyBagに書き込むすべてがビューの変数になります。 それ以外の場合、このファイルはプレーンhtmlです。

これがあなたの最初のシンプルなモノレールの例で、準備ができています。

今、あなたはそれを実行する必要があります。 このプロジェクトをIISの仮想ディレクトリとして追加した場合、もちろんデフォルトでは、.railsアクセス許可を操作する方法がわかりません。 これを行う方法を教えるには、標準のaspnet_isapi.dllを.railsアクセス許可のマッピングに追加するだけです。 たとえば、.aspxファイルの同じマッピングで、そのパスを確認できます。 重要なのは、マッピングを追加するときに[ファイルの存在を確認する]チェックボックスを削除しないでください。物理的に.railsファイルは存在せず、IISはそれらを見つけようとします。



拡張機能へのマッピングの追加



最初はこれで十分だと思います。 もちろん、この記事にはまだ次のような多くの便利な機能がありません。



今すべてについて書くために、私には理由がありません。 しかし、このトピックがあなたにとって興味深いものである場合は、このすばらしいフレームワークに関する記事を執筆し続ける準備ができています。ここでは、上記のすべての項目について詳しく説明します。



Castleプロジェクトへのリンク-www.castleproject.org



All Articles