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のソースコードデバッグが出来ることが嬉しいです。その反面、PythonとC#側との責任範囲が曖昧になる恐れもあります。
ただ、DIだけだとうま味が少ないので、IronPythonを使ったAOPの実現方法についても調査したいところ。