はじめてのMEFその2

MEFのドキュメントを読んでいたら、メソッドをインジェクション可能(Seasar.NETのメソッドインジェクションではない)とあったので早速実験君。

using System;
using System.Reflection;
using System.Linq;
using System.Linq.Expressions;
using System.ComponentModel.Composition;

public class Foo 
{
    [Export("Add")]
    public int Add(int x, int y)
    {
        return x + y;
    }

    [Export("Sub")]
    public int Sub(int x, int y)
    {
        return x - y;
    }
}

public class Bar 
{
    [Export("Mul")]
    public int Mul(int x, int y)
    {
        return x * y;
    }

    [Export("Div")]
    public int Div(int x, int y)
    {
        return x / y;
    }
}


public class Calc 
{
    // メソッドをインジェクションする
    [Import("Add")] public Func<int, int, int> Add { get; set; }
    [Import("Sub")] public Func<int, int, int> Sub { get; set; }
    [Import("Mul")] public Func<int, int, int> Mul { get; set; }
    [Import("Div")] public Func<int, int, int> Div { get; set; }
}

static class Program
{
    public static void Main()
    {
        // 実行モジュール内のクラスをインジェクションする
        var asm = Assembly.GetExecutingAssembly();
        var catalog = new AttributedAssemblyPartCatalog(asm);
        var container = new CompositionContainer(catalog.CreateResolver());

        var calc = new Calc();
        container.AddPart(calc);
        container.Compose();

        Console.WriteLine (calc.Add(5,2));
        Console.WriteLine (calc.Sub(5,2));
        Console.WriteLine (calc.Mul(5,2));
        Console.WriteLine (calc.Div(5,2));
    }
}

/* 結果
7
3
10
2
 */

mixinっぽい?