過去の関連記事
[C#][MEF]Managed Extensibility Framework入門 その1
[C#][MEF]Managed Extensibility Framework入門 その2
[C#][MEF]Managed Extensibility Framework入門 その3
[C#][MEF]Managed Extensibility Framework入門 その4
[C#][MEF]Managed Extensibility Framework入門 その5
前回は、MethodのExportとImportについて試してみました。
これまでの5回で、基本的なImportとExportについては出来るようになりました。そして、適切にExport属性をつけるだけで勝手に適切なImport属性がついてるプロパティに設定されるのは素敵だということを感じたと思います。
今回は、同じ条件に合致する複数のExport属性があるときのImportの仕方について見ていこうと思います。
見ていくといっても大して書くことはなくて、これまで
[Import]
public TPropertyType PropertyName { get; set; }
のように普通のプロパティにしていた部分を
[Import]
public List<TPropertyType> PropertyName { get; set; }
のようにコレクションにするだけでExportが複数ある場合にコレクションにImportされるようになります。
ということで簡単に動きを見ていきます。
とりあえず、MEFEduというコンソールアプリケーションを作って、System.ComponentModel.Composition.dllを参照に追加して、いつもどおりのコンテナの初期化のコードを書きます。
using System.ComponentModel.Composition.Hosting;
namespace MEFEdu
{
class Program
{
static void Main(string[] args)
{
// コンテナの初期化
var catalog = new AssemblyCatalog(
typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
}
}
}
まず、GreetAppクラスを作成します。Actionのコレクションのプロパティを定義して、Import(“Greet”)という属性を付けています。ついでに、Mainのほうも、コンテナからGreetAppのインスタンスを取得して実行するようにします。
using System.ComponentModel.Composition.Hosting;
using System;
using System.ComponentModel.Composition;
using System.Collections.Generic;
namespace MEFEdu
{
class Program
{
static void Main(string[] args)
{
// コンテナの初期化
var catalog = new AssemblyCatalog(
typeof(Program).Assembly);
var container = new CompositionContainer(catalog);
var app = container.GetExportedObject<GreetApp>();
app.Execute();
}
}
[Export]
public class GreetApp
{
[Import("Greet")]
public List<Action> GreetActions { get; set; }
public void Execute()
{
// 登録されている挨拶を実行!
foreach (var action in GreetActions)
{
action();
}
}
}
}
GreetAppクラスのGreetActionsに登録するメソッドを定義していきます。Greeterクラスを作成して、そこにメソッドを定義してExport(“Greet”)属性をつけています。
public class Greeter
{
[Export("Greet")]
public void HelloWorld()
{
Console.WriteLine("Hello world");
}
[Export("Greet")]
public void こんにちは世界()
{
Console.WriteLine("こんにちは世界");
}
}
これで実行すると、複数のアクションが登録されて、実行されるのがわかります。
実行結果
こういう風にして、アプリケーションを何か作る時に、追加処理したいポイントをDelegateのコレクションのプロパティにImport属性をつけたものにしておくと、簡単に拡張できるようになります!!
素敵だ。