kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

にゃんたら Provider で簡単拡張アプリケーション


Azureのテーブルストレージに対応したMembershipやらRoleやらのProvider を書いていて、「別に標準外のプロバイダーを作るのは簡単じゃないか」と気づいたのでメモ
 
ProviderBase の派生クラスとして、自分のほしいAPIセットを持つクラスを作る
 
public abstract class PageTitleProvider : ProviderBase
{
    public override void Initialize( string name, NameValueCollection config )
    {
        base.Initialize( name, config );
        // 追加の初期化処理が必要なら実装する
    }
    public abstract string GetPageTitle( Uri pageUrl );
}
 
ConfigurationSection 派生を作って web.config で定義できるようにする。プロパティを ProviderSettingsCollection を返すとして実装するのがポイント
 
public class PageTitleProviderConfig : ConfigurationSection
{
    [ConfigurationProperty( "titleProviders", IsDefaultCollection=false )]
    public ProviderSettingsCollection TitleProviders { get { return (ProviderSettingsCollection) this["titleProvider"]; } }
}
 
HttpModule を作って Init で ConfigurationSection をとってきて、Providerを初期化して回る。System.Configuration.TypeNameConverter で文字列をTypeに変換するのがポイント Type.GetType(string) だとモジュールのあるアセンブリ内か、mscorlib からしか引けないので注意
 
ProviderSettings には Type のほかに Name および config に使えるParameters があるんで、コードは至極簡単。
 
var configSection = (PageTitleProviderConfig) ConfigurationManager.GetConfig( "pageTitles" );
var tnameConverter = new TypeNameConverter();
var providerCollection = new ProviderCollection();
foreach( ProviderSettings settings in configSection.TitleProviders )
{
    var providerType = (Type) tnameConverter.ConvertFrom( settings.Type );
    var provider = providerType.GetConstructor( Type.EmptyTypes).Invoke(null) as PageTitleProvider
    if( provider ==null ) throw new ConfigurationException("ちがうもん混ぜんな");
    provider.Initialize( settings.Name, settings.Parameters );
    pvoviderCollection.Add( provider );
}
_providerCollection = providerCollection;
 
んで、HttpModule からProvider をもらう方法を用意するわけだが、ConfigSectionに DefaultProvider プロパティとか設けとけばそれのNameでとるだけだったりする
 
public static PageTitleProvider TitleProvider
{
    get { return _providerCollection[_defaultProviderName] as PageTitleProvider; }
}
 
これで、よくあるProvider として web.config (app.config)で設定すればいくらでも使えるプロバイダができあがり、HttpModule も構成ファイルで使う事を指定するのを忘れずに。
 
<pageTitleProviders>
    <add name="pageTitle" type="AzureTablePageTitleProvider, Assembly.Name.Here" />
</pageTitleProviders>
 
ってやればきっと Azureのテーブルからページタイトルを取ってきてくれるんだけど、どっから、どうやってとかはプロバイダが中で考えればよろし、アプリケーションは ModuleからProviderを呼ぶだけ。モジュールから取ってきて呼ぶまでラップしちゃえばProviderの存在自体もアプリケーションは忘れてよろし。
 
アプリケーションの主要処理からストレージの心配とか、むにゃむにゃの心配とか全部消せる(責任はProviderが取るという前提であれば)んでやりたいことに専念したコードに集中できる用になるわけですな。
 
自分たちの商売に関するところだと、カード周りの決済ゲートウェイの仕様とかはあっちゃこっちゃでばらばら、物流連携のフォーマットもバラバラ、ポイントシステムなんて各社各様にもほどがあるの世界なんだけど、これをProvider にすると、config でコレとアレとドレをアプリケーションに使わせるって指定すればそれで動くようになるわけですな。
 
てなわけで、Provider書こうよProvider!!
 
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。