IronPythonでDIモドキ

http://d.hatena.ne.jp/akiramei/20060702/p1
上記のサンプルはS2.NETを使っていますが、これをIronPythonを使って書き換えてみます。
diconファイルの替わりにPythonソースコードを用意します。

from ConsoleApplication3 import *

py_Greeting = Greeting()
py_Greeting.Message = "Hello, World"

Greetingオブジェクトを生成し、Messageプロパティに値を設定します。setterインジェクション。

次にIGreetingViewインタフェースを持つオブジェクトを生成します。

from ConsoleApplication3 import *

py_IGreetingView = GreetingConsoleView()
# py_IGreetingView = GreetingMessageBoxView()

コンソールとメッセージボックスが選べますが、今回はコンソールとしておきます。

最後にIGreetingServiceです。

from ConsoleApplication3 import *
from Greeting import *
from IGreetingView import *

py_IGreetingService = GreetingService()
py_IGreetingService.Message = py_Greeting
py_IGreetingService.View = py_IGreetingView

GreetingServiceオブジェクトを生成し、プロパティには設定ファイル(Pythonコード)で生成したオブジェクトを設定します。

これで準備は完了。C#側のコードはどうなるかと言いますと、

using System;
using System.Collections.Generic;
using System.Text;
using IronPython.Hosting;

namespace ConsoleApplication3
{
    class Program
    {
        static PythonEngine engine;

        static void Initialize()
        {
            EngineOptions options = new EngineOptions();
            options.ShowClrExceptions = true;
            engine = new PythonEngine(options);
            engine.AddToPath(".");
            engine.LoadAssembly(System.Reflection.Assembly.GetExecutingAssembly());
        }

        static void Main(string[] args)
        {
            Initialize();

            engine.ExecuteFile("IGreetingService.py");
            IGreetingService service = engine.EvaluateAs<IGreetingService>("py_IGreetingService");

            service.Say();
        }
    }
}

エンジンにスクリプトを評価させて、インタフェースを受け取るだけ。Pythonスクリプトエンジン持ってきただけなので、単なる依存関係の注入しか出来ませんが、作り込めば面白いものになるかも知れませんね。Pythonの表現力が高いこと、VS2005上でPythonソースコードデバッグが出来ることが嬉しいです。その反面、PythonC#側との責任範囲が曖昧になる恐れもあります。

ただ、DIだけだとうま味が少ないので、IronPythonを使ったAOPの実現方法についても調査したいところ。