【F# + ASP.NET MVC】 MEFによるプラグイン開発を行うには

◆ プラグイン用インターフェース

namespace PluginInterface

type IPlugin =
   abstract member Execute : string

◆ プラグイン(DLLファイル)

namespace PluginModule

open System
open System.ComponentModel.Composition
// プラグイン用インターフェース
open PluginInterface

// Export属性で、プラグイン用インターフェース型を設定
[<Export(typeof<IPlugin>)>]
type PluginModule1() =
    interface IPlugin with
        // インターフェース メソッド
        member this.Execute = "Hello Plugin!"

◆ MEFで動的にDLLファイルを読み込む

namespace Sample.Controllers

open System.Web
open System.Web.Mvc
open System.Web.SessionState
open System.ComponentModel.Composition
open System.ComponentModel.Composition.Hosting
open PluginInterface

type HomeController() =
    inherit Controller()
    
    [<DefaultValue>]
    val mutable plugin : IPlugin
    
    // Import属性で、プラグイン用インターフェース型を設定
    [<Import(typeof<IPlugin>)>]
    member public x.Plugin
        with get() = x.plugin
        and set v = x.plugin <- v

    member this.Index() =
        // binディレクトリよりカタログを検出(プラグイン用DLLをbinディレクトリに配置)
        let catalog =
            new DirectoryCatalog(HttpRuntime.BinDirectory, "PluginModule.dll")
        // カタログを用いてコンテナからパーツを検出
        let container = new CompositionContainer(catalog)
        this.Plugin <- container.GetExportedValue<IPlugin>()
        // プラグインのインターフェース メソッドを実行
        this.ViewData.["Message"] <- this.Plugin.Execute
        this.View() :> ActionResult

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中