アプリケーション拡張サービス
Silverlightでは、アプリケーションの初期化コードであればApp.xamlに定義されたStartUpイベントに記述を行い、終了時のイベントであればExitイベントに記述を行います。Silverlight 3ではアプリケーション拡張サービスによって初期化コードや終了コードをコンポーネント化し、あらかじめ登録できます。
例えば独自フレームワークの初期化コードをコンポーネント化しておくことで、ユーザーは初期化コードをわざわざApp.xamlに記述する必要がなくなり、クリーンアップコードの記述忘れもなくなるでしょう。
Silverlightアプリケーションを拡張するには、Applicationクラスのサブクラスを作ってApplicationクラスを置き換える方法と、Silverlight 3から提供されたアプリケーション拡張サービスを利用する方法の2通りの方法があります。しかし、Applicationクラスのサブクラスを作る方法では、ほかのフレームワークを適用しづらくするといったマイナス面の方が多いため、通常はアプリケーション拡張サービスを利用した拡張を行うべきでしょう。
サービスを実装する場合、IApplicationServiceインターフェースを実装したクラスをApp.xamlに登録して利用します。
サービスを追加する場合は次の3つのステップの作業を行います。
- IApplicationServiceインターフェースの実装
- (必要であれば)IApplicationLifetimeAwareインターフェースの実装
- サービスを登録
1. IApplicationServiceインターフェースの実装
アプリケーション拡張サービスにサービスとして登録するためには、必ずIApplicationServiceインターフェースを実装する必要があります。IApplicationServiceインターフェースはStartServiceメソッドとStopServiceメソッドを実装することで、アプリケーションの初期化コードや終了コードを記述できます。
リスト3はアプリケーション起動時に初期化パラメータを取得して、静的な変数にパラメータを設定しているサンプルです。
public class CustomService1 : IApplicationService
{
/// <summary>
/// アプリケーションの起動パラメータを保持します。
/// </summary>
public static MyApplicationContext MyContext { get; private set; }
#region IApplicationService メンバ
/// <summary>
/// アプリケーションの開始時に実行されます。
/// </summary>
public void StartService(ApplicationServiceContext context)
{
MyContext = new MyApplicationContext()
{
Parameter1 = context.ApplicationInitParams["param1"],
Parameter2 = context.ApplicationInitParams["param2"],
};
Debug.WriteLine("CustomService1 StartService");
}
/// <summary>
/// アプリケーションの終了時に実行されます。
/// </summary>
public void StopService()
{
Debug.WriteLine("CustomService1 StopService");
}
#endregion
}
アプリケーションの起動パラメーターは、ApplicationServiceContextクラスのApplicationInitParamsプロパティに格納されています。リスト3の例では、StartServiceメソッド内で、Objectタグのparams経由でアプリケーションの起動引数を受け取り、独自のMyApplicationContextクラスのインスタンスに値を格納しています。
MyApplicationContextクラスの定義をリスト4に示します。
MyContextはstaticプロパティとして定義しているので、アプリケーションコードからは、CustomService1.MyContextといった方法で簡単にアプリケーションのコンテキストにアクセスできます。
public class MyApplicationContext
{
public string Parameter1 { get; set; }
public string Parameter2 { get; set; }
}
Objectタグでアプリケーションにパラメーターを渡す場合、リスト5のようにinitparamsにパラメータ名=値の一覧をカンマ区切りで指定します。
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> <param name="source" value="ClientBin/Silverlight3-7Sample.xap"/> <param name="onError" value="onSilverlightError" /> <param name="background" value="white" /> <param name="minRuntimeVersion" value="3.0.40818.0" /> <param name="autoUpgrade" value="true" /> <param name="initparams" value="param1=パラメーター1,param2=パラメーター2" /> </object>
