はじめに
これまでデスクトップアプリ(WinForms)の開発では、MEFで開発を行ってきたが、
ASP.Netでも導入できないか試行錯誤し、構築した際のメモ
※MEFは拡張可能なアプリケーションを作るためのDIフレームワーク
MSでは、.Net Framework4より標準で搭載されており、ライブラリ無しで利用できる
処理概要
Webアプリケーションの場合は、デスクトップアプリ(WinForms)とはことなり、
PageやControlがリクエストの度に生成されるため、このタイミングで
MEFコンテナを呼び出しインスタンスを生成する
MefUtil.cs
MEFコンテナを利用するクラスを作成、初期時インスタンスが必要なdllを読み込んでおき、
ComposeParts()メソッドでインスタンスの生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class MefUtil { private static CompositionContainer container; static MefUtil() { var catalogs = new AggregateCatalog(); var asms = AppDomain.CurrentDomain.GetAssemblies(); foreach (var asm in asms) { if (asm.FullName.StartsWith("XXXX")) { var catalog = new AssemblyCatalog(asm); catalogs.Catalogs.Add(catalog); } } container = new CompositionContainer(catalogs); } public static void ComposeParts(Control control) { container.ComposeParts(control); } } |
TestPage.aspx.cs
ページの場合は、Page_Init()で呼び出す。
1 2 3 4 5 6 7 8 9 10 |
public partial class TestPage : System.Web.UI.Page { [Import] public StaffDao StaffDao { get; set; } protected void Page_Init(object sender, EventArgs e) { MefUtil.ComposeParts(this); } } |
TestPage.aspx.cs
ユーザーコントロールの場合は、Page_Init()で呼び出す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class LoginDialog : System.Web.UI.UserControl { [Import] public StaffDao StaffDao { get; set; } protected override void OnInit(EventArgs e) { MefUtil.ComposeParts(this); } protected void OnCallbackLogin(object sender, CallbackEventArgsBase e) { var staffId = this.TextStaffId.Value + ""; var staffPass = this.TextStaffPass.Value + ""; var sentity = this.StaffDao.GetStaffs().Where(x => x.StaffId == staffId).FirstOrDefault(); if (sentity != null) { if (!HashUtil.Login(sentity.StaffHash, staffPass)) { this.Session["LoginId"] = sentity.StaffId; } else { this.LabelErrorMessage.EncodeHtml = false; this.LabelErrorMessage.Text = this.CreateErrorMessage("スタッフID又はパスワードが違います"); } } else { this.LabelErrorMessage.EncodeHtml = false; this.LabelErrorMessage.Text = this.CreateErrorMessage("スタッフID又はパスワードが違います"); } this.CallbackLogin.JSProperties["cp_command_name"] = commandName; } } |