ServiceStackで埋め込みリソースのMarkdownをレンダリング
オープンソースのWebサービスフレームワークServiceStack。初めてこの手のフレームワークを触ることもあって楽しいのだけど、日本語の情報がとにかく少ない。
このフレームワークはMarkdownとRazorに対応していて、下位ディレクトリにcshtmlだのmdだの置いておけば簡単にレンダリングしてくれるんです。
じゃあこれらのファイルをリソースとして埋め込んだら?
拡張子を元にファイルを検索しているようなので、そのままでは表示されません。
なので手動で登録。
public override void Configure(Funq.Container container) { var asm = typeof(Host).Assembly; using (var s = new StreamReader(asm.GetManifestResourceStream("ServiceStackTest.default.shtml"))) MarkdownFormat.Instance.AddTemplate("default.shtml", s.ReadToEnd()); using (var s = new StreamReader(asm.GetManifestResourceStream("ServiceStackTest.markdown.md"))) MarkdownFormat.Instance.AddPage(new MarkdownPage(MarkdownFormat.Instance, "markdown.md", "markdown", s.ReadToEnd(), MarkdownPageType.ContentPage) { TemplatePath = "default.shtml" }); using (var s = new StreamReader(asm.GetManifestResourceStream("ServiceStackTest.view.md"))) MarkdownFormat.Instance.AddPage(new MarkdownPage(MarkdownFormat.Instance, "view.md", "view", s.ReadToEnd(), MarkdownPageType.ViewPage) { TemplatePath = "default.shtml" }); }
テンプレートはAddTemplate、それ以外はAddPageで登録します。
templatePathとfullPathは本来サーバー上のフルパスで登録しますが、今回はレンダリング時も自分で指定することになるのでまあ適当に。
続いてサービス側でレンダリングします。
public object Execute(int request) { // ViewPage, ViewSharedPageなら var model = new Hoge(); return MarkdownFormat.Instance.RenderDynamicPageHtml("view", model); // ContentPageなら return MarkdownFormat.Instance.RenderStaticPageHtml("markdown.md"); }
よく似ていますが、RenderDynamicPage(Html)はページ名(拡張子なしファイル名)、RenderStaticPage(Html)はフルパスを指定しないといけません。
本来はIHttpResult.TemplateName、レスポンスオブジェクトの型名、OperationName(たぶんアクション名)と一致するView、SharedViewを自動的に使ってくれるんですけどね・・・