アーカイブ

Archive for 2010年11月

MVVMとはを学ぶ上でこれ以上無い資料が公開中

この前の勉強会でメッセージ通信の話をしていた @ugaya40 さんが、MVVMパターンと他のUIパターンというタイトルで資料を公開されています。なんというか、この前の勉強会の前半で僕が言いたかったことが凄まじく良くまとまっています。

MVVMってなに?MVCやMVPと何が違うの?何が嬉しいのって部分で悩んでいる方。必読です!!

MVVMパターンとイベント駆動開発、そしてMVC/MVP/PMパターンとの関係 – 何故MVVMなのか
http://ugaya40.net/wpf/mvvm-mvc-mvp-pm-eventdriven.html

広告
カテゴリー:Silverlight タグ: ,

すぐに値を返したい。VBも出来る子です。

昨日のサンプルでこんなコードブロックがありました。

 var path = context.Server.MapPath(
      ((Func<UserContext, string, string>)((u,appName)=>
            {
                if (appName == "app1" && u.UserId == "karua")
                    return @"\ClientBin\SilverlightApplication1.xap";
                else
                    return @"\ClientBin\SilverlightApplication2.xap";

            }))(userContext, app)

((Func<UserContext, string, string>)(u, appName) => {}))(userContext, app)ってなんか意味分かんないっすよね。無名のままだとダメだから名前をつけるか型を明示しないとコンパイラーに怒られるんですけれど。

実際にプログラミングするときは、コードブロックにする以上は意味が有るんだからメソッド分けろよという意見も有るんだろうけれど、ぼーっとプログラミングするときには、わざわざ別にするのも考えが妨げられて嫌だなーと。

で、これが実はVBだとこうかける。

Dim path = context.Server.MapPath(
    (Function(u, appName)
         If (appName = "app1" AndAlso u.UserId = "karua") Then
             Return "\ClientBin\SilverlightApplication1.xap"
         Else
             Return "\ClientBin\SilverlightApplication2.xap"
         End If
     End Function)(userContext, app))

キャストがいらない!!

以上でした。

カテゴリー:プログラミング タグ:

ログインしているユーザー情報をもとに返却するXAPファイルを変更する。

ユーザーによって違うバージョンを提供したいという場合があります。

例えば一般ユーザーには安定しているVersion 1.0を使わせたいけれど、あるユーザーにはお試し版のVer1.1のSilverlightアプリケーションを使わせたいといった場合です。場合によっては古いアプリケーションをしばらく使わせたいといった場合も有るでしょう。

ASP.NETでどうにかしたい場合は例えば次の方法が思いつきます。

  1. SilverlightをホストするHTMLのobjectタグを動的に書き換える。
  2. ジェネリックハンドラーで動的に切り替える。
  3. IHttpHandlerで動的に切り替える。 2のジェネリックハンドラーで動的に切り替える方法を考えてみます。

概要

Silverlightをロードする場合、通常であればsourceパラメーターにSilverlightの配置先を指定します。

HTML側にはすべてのユーザーで同じURLを指定させ、ユーザーのセッション情報をもとにデータベースで管理しているユーザーごとのバージョンテーブルを検索し、ユーザー別に指定されたXAPファイルをダウンロードさせます。

image

ジェネリックハンドラーの記述

通常ASP.NETのページはASPXの拡張子で作成しますが、画像やXAPファイルなどのコンテンツファイルを動的に返したいときはASHXを利用することで余計な処理が少ない分パフォーマンスよくクライアントに折り返すことができます。

Visual Studioでジェネリックハンドラーを追加したい場合には、Visual StudioでGeneric Handlerを追加します。

image

ジェネリックハンドラーではどのようなコンテンツを返却するかをProcessRequestメソッドに記述します。

実際に返却するコンテンツは、ProcessRequestメソッドの引数であるHttpContextクラスのResponseプロパティーやRequestプロパティー、Sessionプロパティーをもとに値を返却します。ただし、Sessionプロパティーを利用するためには、IRequiresSessionStateインターフェイスを実装する必要があります。

using System;
using System.Web;
using System.IO;
using System.Web.SessionState;

namespace WebApplication1
{
    public class SilverlightVersionSelector : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/xaml+xml";

            // 1.QueryStringからアプリケーション名を取得する。              //
            var app = context.Request["xap"];
            if (string.IsNullOrEmpty(app))
            {
                context.Response.BinaryWrite(XapManager.GetDefaultXap());
            }

            // 2.セッション情報からユーザーの情報を取得する。
            if (context.Session == null || context.Session["_userContext"] == null)
            {
                context.Response.BinaryWrite(XapManager.GetBeforeAuthenticationXap(app));
                return;
            }
            var userContext = context.Session["_userContext"] as UserContext;

            // 3.アプリケーション名とユーザー情報からユーザーに返却するXAPを決定する。
            var path = context.Server.MapPath(((Func<UserContext, string, string>)((u,appName)=>
            {
                if (appName == "app1" && u.UserId == "karua")
                    return @"\ClientBin\SilverlightApplication1.xap";
                else
                    return @"\ClientBin\SilverlightApplication2.xap";

            }))(userContext, app));

            // 4.XAPファイルが存在したら、XAPファイルを返却する。
            if (!File.Exists(path))
            { 
                context.Response.StatusCode = 404;
                context.Response.End();
                return;
            }
            context.Response.BinaryWrite(File.ReadAllBytes(path));
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }

    }
}

順番に見ていきましょう。

1.QueryStringからアプリケーション名を取得する。

通常であれば、Silverlightをロードする場合は次のようなHTMLでXAPファイルを指定します。

<object data="data:application/x-silverlight-2," 
        type="application/x-silverlight-2" width="100%" height="100%">
  <param name="source" value="/ClientBin/SilverlightApplication1.xap"/>
  <param name="onError" value="onSilverlightError" />
  <param name="background" value="white" />
  <param name="minRuntimeVersion" value="4.0.50401.0" />
  <param name="autoUpgrade" value="true" />
</object>

今回は作成したジェネリックハンドラーを指定し、xapパラメータをもとにロードするXAPファイルを切り替えます。もしXAPパラメーターが指定されなかった場合は、既定のXAPファイルがロードされるようにしておきましょう。

<object data="data:application/x-silverlight-2," 
        type="application/x-silverlight-2" width="100%" height="100%">
  <param name="source" value="/SilverlightVersionSelector.ashx?xap=app1"/>
  <param name="onError" value="onSilverlightError" />
  <param name="background" value="white" />
  <param name="minRuntimeVersion" value="4.0.50401.0" />
  <param name="autoUpgrade" value="true" />
</object>

2.セッション情報からユーザーの情報を取得する。

セッション情報から現在ログインしているユーザーの情報を取得します。ジェネリックハンドラーでセッション変数を利用する場合はIRequiresSessionStateインターフェイスを実装しないと、Session変数が取得できないので注意しましょう。ここでも取得できない場合にはログイン前のXAPファイルを返すようにしておきましょう。

3.アプリケーション名とユーザー情報からユーザーに返却するXAPを決定する。

今回のサンプルでは、単純にxapパラメーターがapp1で、セッション変数に格納されているユーザー名がkaruaだったらSilverlightApplication1.xapを、それ以外だったらSilverlightApplication2.xapを返すようにしていますが、本来でしたら、データベースなどのユーザー別の台帳のようなものを用意して検索するようにします。

4.XAPファイルが存在したら、XAPファイルを返却する。

3で取得したファイルが存在したら、ファイルの情報をバイナリーで読み出しHttpContextクラスのResponseプロパティーのBinaryWriteメソッドを使って書き出します。

カテゴリー:Silverlight タグ: ,

MVVM を使った アプリケーション開発 -基本編-

2010年11月6日 1件のコメント

本日(11/6)の第60回codeseek勉強会・第2回日本C#ユーザー会勉強会で使用するスライドと、サンプルアプリケーションのソリューションファイルをとりあえずアップロードしておきます。1時間枠のセッションはかなり久々なので時間配分がどうなるかが全然わかりません。まぁなるようになるかなと思いながら。。。

⇒スライド MVVMを使ったアプリケーション開発 -基礎編-

http://cid-b17f5fcd8095628b.office.live.com/view.aspx/%E5%85%AC%E9%96%8B/MVVMMVVM%E5%9F%BA%E6%9C%AC%E7%B7%A8.pptx

⇒Visual Studio 2010ソリューションファイル サンプルアプリ

http://cid-b17f5fcd8095628b.office.live.com/self.aspx/%e5%85%ac%e9%96%8b/MVVMSample.zip

カテゴリー:雑記, Silverlight タグ: