ラベル Oxite の投稿を表示しています。 すべての投稿を表示
ラベル Oxite の投稿を表示しています。 すべての投稿を表示

2008年12月22日月曜日

Oxiteのソリューション構成

ちょいちょいソースを見ていこうと思うところで、まずはソリューションの構成を確認して、どんなコードがどのプロジェクトに含まれてるのかを把握しとこうかなと。


ソリューションを開いたところで、表示されるプロジェクトは↓。

img.aspx

それぞれのプロジェクトに何が含まれてるのかを見てみたよ。

1.Oxite


このプロジェクトにOxiteで共通のライブラリコードや、インターフェースが集中。
BackgroundServicesにBackgroundServicesで実装する各種バックグラウンドタスクのベースクラスや、インターフェース。
Configurationにはweb.configのカスタムエレメント用のクラス。クラス自体は大量にあるけど、内容は各設定値を取得するための物だからエレメントの数だけクラスがある感じ。
Dataにはデータベースのモデルクラスのインターフェース。実装はLinqToSqlProviderに入ってる。
HandlersにMetaWeblogAPIとXmlRPCのクラス。コントローラクラスだけじゃなくてこのハンドラもルーティング登録されてるからコントローラを探しても見つからず。
Routingにはそのままルーティングを登録するクラス。ルート登録の詳細がMVCのWebアプリケーションのglobal.asaxじゃなくて、ここにすべてまとめて入ってる。
Searchに検索機能のインターフェース。
あと、ルートに共通関数が入ってる。
で、 StringExtensionsクラスにStringクラスの拡張メソッドが入ってるんだけど、なんとこの中でAntiXssLibraryをラップしてる関数有り。AntiXss.HtmlEncodeとAntiXss.HtmlAttributeEncodeを使って、エンコードするようにしてる。さすが抜け目なし。ただバージョンは先日公開された3.0じゃなくて1.5を使ってる。ちょっと古いのを使ってるのが気になるところだけどリリースの関係でOxiteの先にリリースしてるし、MIXのサイトでも使ってるって事で、そこはやむなしな感じで。

2.Oxite.BackgroundServices

バックグラウンドで動作する機能の実装。
何個かクラスがあるけど、ようはメール送信(SMTP送信)とトラックバック送信(HTTP POST)の2つを処理してる(と思う)。
CreateMessagesFromSubscriptions(BackgroundService)

コメントをメールメッセージとしてMessageRepositoryに登録。

SendMessages(BackgroundService)
MessageRepositoryに登録されてるメッセージをメール送信。

CreateTrackbacks(PostBackgroundServiceAction)
トラックバック要求をBackgroundServiceActionRepositoryに登録。

SendTrackbacks(PostBackgroundServiceAction)
BackgroundServiceActionRepositoryに登録されてる要求を実行。

3.Oxite.LinqToSqlProvider


QxiteプロジェクトのData内に定義されてる、リポジトリの実装。
モデル自体はLINQ to SQL(dbml)で定義されてるのをそのまま。
あとIQueryable<T>の拡張メソッドでページングデータ(PageOfAList<T>)を取得するものや、モデルクラスの拡張機能など。
MembershipRepositoryがoxite_User/oxite_Roleなんかを見るような独自実装なのがちょっと以外。これはGravator対応とかが関係してるんだろうか?関係なさそうだけどなんでASP.NETのMembershipじゃダメなんだろうね~。

4.Oxite.LiveSearchProvider


サイト検索をWindows Live Searchで実行するための実装。
http://soap.search.live.com/webservices.asmx?wsdlへのWeb参照(SOAP)で検索要求を送信して、結果を取得するようになってる~。

5.Oxite.SearchProvider


これも検索用の実装なんだけど、こっちはLINQ to SQLで実行。
Post.SearchPost(TitleとBodyをくっつけたもの)に対してContainsで単純に検索してる。
Like検索だね。

6.Oxite.MVC


このプロジェクトに全部のコントローラクラスが入ってる。
OxiteApplication クラスがHttpApplicationを派生したクラスとして、定義されててこの中のOnStartでバックグラウンドサービスの開始や、ルーティング登録の実行。BeginRequestでリダイレクトがどうのこうのって処理があるけど、なんのタメの機能なのかよくわかんないかも。
ControllerもBaseControllerっていうクラスをベースにして実装。
ルーティングとコントローラのクラス名を見比べると、URLの設計はそれはそれだろ的な思いもちらほらと。


AccountController(Users/{userName}/~,SignIn,SignOut)
AdminController(Admin/~)
ArchiveController(Archive/{*archiveData})
AreaController({areaName}/~)
FileController
HomeController
PageController({*pagePath})
PingbackController({id}/Pingback)
SearchController(OpenSearch.xml,Search/~)
SEOController(Robots.txt,SiteMap/~)
TagController(Tags/{tagName}/~)
TrackbackController({id}/Trackback)


Viewで使うViewPageクラスの代わりにBaseViewPage/BaseViewUserControlなんかを定義。
OxiteSite(Webアプリケーション)で使う共通関数なんかもここで定義。Oxiteでも共通関数があったりするけど、Webアプリケーションでしか使わないのはたぶんここに集中してるんだろね。
ヘルパーの拡張なんかもここ。
FeedResultっていうのがなぜかViewResultから派生させて、Viewとして定義してるのはちょっとダサイ気がしなくもない。
Trackback/Pingbackを属性クラスで定義して、ViewDataにディスカバリー情報を入れるっていうのはカッコイイ。

7.OxiteSite


これがサイトの実体プロジェクト。
でも、実質コントローラもロジックも別のプロジェクトにごっそり入ってて、ここではもっぱらViewに関する物だけがある。
なので、Global.asaxのコードビハインドではOxiteApplicationクラスから派生。
ほとんどのViewにAtom/Rssそれぞれのフィード専用Viewが入ってて冗長な気が...。もう少し綺麗にできるんじゃないのかな~。ダメなのかな~。
特徴的なのはViewDataがすべてDictionaryのままで、View内キャストするようになってるとこ。
ViewPage<T>なんて定義はなく、すべてキャスト。しかもViewに結構なコードが含まれてる気がする。
あと、ルートにLiveWriterManifest.xml(Windows Live Writer Provider Customization API) があって、MetaWeblogAPIに関する設定が書かれてた。こんなファイルがあるのを初めて知りました。


とりあえず、含まれてるプロジェクトはこんな感じってことで。
中身・機能についてもちょいちょい見ていきます。

2008年12月19日金曜日

Oxite

Oxite – Home


いろんなニュースサイトでも取り上げられてるから知ってる人も多いと思います。
このOxite(おくさいと)、ASP.NET MVCで作られてるってことで楽しそうじゃないですか。

Oxite - Lab - MIX Online

↑ここで紹介ビデオが見れます。

何にせよ、どんなものかを知るには動かしてみるのが一番。
ということで、まずはソースのダウンロード
ファイルを解凍してソリューション(Oxite.sln)を開いて見よう。

img.aspx

あれれ~?怒られちゃった。dbprojが開けないってさ。
まぁいいや。そんな人のタメにもう一つソリューションファイル(Oxite.VWDExpress.sln)が入っててそっちを開きましょう。
データベース関連のプロジェクトはたぶん使う事ないし。
今度は問題なく開けたので早速実行。

img.aspx2

あっさり動いたね。
さて、使い方がサッパリ分からない。
とりあえず、ログインしてみるものの(Admin/pa$$w0rdで)「で?」って感じです。

img.aspx3

"Create Post"がブログエリアの投稿で、"Create Page"がページの投稿みたいだけど、画像ファイルをアップロードするインターフェースもWYSIWYGなエディタがあるわけでもない。素っ気ないな~。
MetaWeblog API対応なOxiteにはWindows Live Writeがピッタリなんじゃん?と、Aboutページにも書いてるしで、早速インストール(使ったことないも~ん)。

img.aspx4

んで、アカウントの設定をして、いざ投稿!

img.aspx5

なるほど。

img.aspx6

おぉ~。ちゃんと投稿できた。スラッグ(ナメクジじゃないよ、URLのページ名だよ)に日本語入れてみるなんていう意地悪してみたら、ちゃんとエンコードされてた。やるな。
※"新しい記事"(ブログ)は投稿出来るけど、"新しいページ"が投稿出来ないのは何でなんすか?

つか、この投稿者の写真の人誰だよ...。替えたいけど替え方が分からない。まぁちょいちょいソース追いかけようかな。

デザインテンプレートも特に気の利いた物もないし、エディタもテキストエリアだしで、普通に使うのには面倒かもしれないけど、バックグラウンドで処理が走るように作られてたり(パッと見た感じではTimerで起動するみたい)、MetaWeblogAPI対応だったり、プロジェクトが細かく分かれてたりで、気になるところ盛りだくさん。

img.aspx7

小さくし過ぎて見にくいけど、コードメトリックス。
OxiteSiteっていうのがASP.NET MVCのWebサイトなんだけど、コード量が異常に少ないのは、Oxite.MVCにすべてのコントローラが入ってるし、Oxiteと Oxite.LinqToSqlDataProviderにRepositoryとロジックが入ってるから。

MVCのバージョンが変わっても、変更箇所をOxiteSiteだけに押さえてしまおうということかな。
にしても、Viewをちらっと見たけど、ViewDataが型無しのディクショナリだったのがちょっと意外。キャストしまくってるし。

しばらくコードを見たり、動かしたりしながら遊んでみようかな~、なんて。
で、ちょいちょい気になった部分をエントリしちゃったりするのも面白そう。

dotnetConf2015 Japan

https://github.com/takepara/MvcVpl ↑こちらにいろいろ置いときました。 参加してくださった方々の温かい対応に感謝感謝です。