DI

IExpressionインタフェースのヌル実装

評価式のインジェクションのテスト及び、各種実装(Javascript, PowerShell)の性能比較を行うためにIExpressionインタフェースのヌル実装を用意してみた。 public class NullExpression : AbstractDotnetExpression { public NullExpression(string expressio…

式評価の実装を指定する語彙

式評価時の例外スローが性能に大きな影響を与えることが判ったため、式評価時にできるだけ例外をスローしないようにしたい。しかし、元々どのように書かれているか判らない評価式をパースしてエラーを返すのはスクリプトエンジン側の処理であり、コンテナ側…

PowerShellExpression クラスの実装

先日はPowerShellによる式評価が簡単にC#から呼び出せることが判ったので、次の段階として実際にDIコンテナに組み込んでみることにした。と書くと大袈裟になりそうな感じがするが、元々Sesar2等と同様の評価式インタフェースは実装が既に済んでいるので、そ…

Expression Evaluation for DIContainer

seasar2は設定ファイル上の評価式をOGNL式から評価して、結果をインジェクションすることが可能だが、これが非常に強力な機能となっている。(と私は思う) となると、.NETのDIコンテナでも当然評価式をインジェクションしたいのだが、残念ながらOGNLの.NET(CL…

DataBidingsAttributeによる双方向データバインディングの自動化

Form(とControl)をViewに見立てて、データやロジックと分離するプログラミングをする場合、データをView、つまりForm(とControl)に転記する、逆にViewからデータに値を書き戻すという処理を書くのは単純で面倒だ。WindowsFormsの双方向データバインディング…

DIコンテナにおける自動処理の有無と初期化時間の比較 (その2)

前回のエントリに対して、ひがさんからコメントを頂いた。 プロパティのリフレクション情報をキャッシュしてます? キャッシュしてれば、それほど変わらない気がするんですけど .NETは、JavaのようにBeanDescのようなクラスを経由せず、型(Type)クラスから直…

DIコンテナにおける自動処理の有無と初期化時間の比較

先日のスマートクライアントのDI戦略(その2)に関して、id:higayasuoさんにコメントを頂いた。 自動バインディングのオーバヘッドは、ほとんどないことが、ベンチマーキングの結果わかっています。 コンポーネントの自動登録についても、DISKのIOが早い場合に…

スマートクライアントのDI戦略(その2)

DIコンテナによる依存性の解決 登録するコンポーネント間の依存性を宣言的、又は自動的に解決するのがDIコンテナの特徴的な機能だ。しかし、依存性の解決にも当然ながら処理コストがかかるので、クライアントアプリケーションではその辺を考慮して依存性解決…

スマートクライアントのDI戦略(その1)

DI(Dependency Injection)戦略などと、それっぽい題名を付けているが大したことではない。一般的なクライアントアプリケーションに必要なリソース戦略と大して変わらない。DIの扱いに関してはいろいろなところで紹介されているが、明記されていないまでも、…

カスタム属性の逆引きが欲しい その2

昨日のエントリより このような処理は数個〜10個程度のプロパティしか持たない自作のクラスの場合は全く問題無いが、.NET Frameworkで提供されているクラスを派生したクラスに対してプロパティ情報のパースを行うと、祖先までクラス階層を手繰ると数百のプロ…

カスタム属性の逆引きが欲しい

相変わらずDIがらみの話になるが、任意のプロパティに対してアノテーション(以降カスタム属性)でのインジェクションを指定するとしよう。カスタム属性はこんな感じに指定する。(語彙は最も親しんでいるSeasar2の語彙を使用させて頂く) [Binding(Value = "Kaz…

コンポーネントの自動登録機能で考えること その2

いろいろ考えたが、コンテナに登録する際の自動バインドモードの既定値は、"自動バインドしない"に決定しようと思う。いろいろあるが、決定したのは以下の2点から。 クラスを使うユーザ(プログラマ)が、そのクラスの全てを知っているとは限らない これは、意…

コンポーネントの自動登録機能で考えること

以前の日記で書いたAssemblyComponentAutoRegisterだが、一通り実装してみた。最初はAutoRegister周りだけを用意して、DIコンテナにぼこぼこと登録してやればよいと、簡単に考えていたのだが、これが甘かった。実際には アセンブラとデプロイヤの構造の見直…

DIコンテナの初期化

メモアプリケーションがDIコンテナを使う際の準備としては 設定ファイル等から定義情報を読み込んで、コンポーネント定義情報を構成する コンポーネント定義情報を基にコンポーネントを生成して、依存性を解決する 一般的にはこの2段階の処理が必要なのだが…

ComponentAutoRegister

Seasar2 DIコンテナにおける、コンポーネント自動登録機能のクラス。本家Java版では、ファイルシステムから任意のパターンで自動的にクラスを登録する、FileSystemComponentAutoRegisterクラスや.jarアーカイブから同様にコンポーネントを登録する、JarCompo…

WindowsFormsとDI

#id:sugimotokazuyaさんの日記に反応してみる。 WindowsアプリケーションでS2Container.NETを利用する場合、どこでS2Containerからコンポーネントを取得するのか、System.Windows.Forms.Formクラスはどこでインスタンス化するのかを決めなくてはなりません。…

Field Injection

DI

最新のSeasar(2.4)が対応した、プロパティインジェクションの拡張といえそうな機能。 "hogehoge" と定義ファイルを記述しておくと、JavaBeans規約に準拠したアクセサが存在しなくても、同名のフィールドがあれば値を注入する。ここで考えるのは、同等の機能…

依存性解決の方向

Sesar2(s2dotnet)の実装を見ていてふと思ったのだけど以下のように3つのdiconをインクルードするroot.diconが構成されていた場合 root.dicon bar1 bar1.dicon foo bar2.dicon foo bar3.dicon foo DIコンテナは以下のようなdiconの定義から構成されるコンポジ…

App.configすら不要

昨日の日記では.NETにおけるDIコンテナの設定ファイルの配置方法について言及したが設定ファイルを全て埋め込みリソースとした所でこのままではApp.configの配布だけは必要だということに気がついた。というのもDIコンテナの設定ファイルへのパスは以下のよ…

ファイルかリソースか

DIコンテナの設定ファイル(Sesar2なら〜.dicon)はJavaの場合は近傍に配置したXML形式のファイル、とほほ決めつけても良いのだが.NETの場合は少なくとも以下の二つの配置方法が考えられる。 1.アセンブリの近傍に配置したXMLファイルの形式 2.アセンブリに埋…

やっぱりやっちゃった

DI

DIコンテナに登録するコンポーネントのクラスに特定のインタフェースを入出力するプロパティを追加した事をすっかり忘れていた。そのままテストをしたらDIコンテナに「該当のインタフェースはコンポーネントとして複数回登録されているのでバインドできない…

DIのデバッグ

DI

周知だが去年からDI(Dependency Injection)ベース(既にDI部分は設定ファイルの語彙がs2dotnetと同じなので敬意を表して"+Sesar2クローン"、"+s2dotnetクローン"と呼ぶべきなのかもしれない)のスマートクライアント向けフレームワークを書いている。テスト目…

なにげなDIの効用

DI

現在の仕事だが最も時間を割いているのは去年から書いてきたスマクラ用フレームワーク用のクラスを全てDIコンテナを使うことをベースに書換る作業だ。結構大がかりになっている。 DI(Dependency Injection)コンテナを使うメリットは散々いろいろな所で既出な…

.NETらしさとDI

DIコンテナと.NETを組み合わせた時の「.NETらしさ」を考えてみたのですがすぐに思いつくのは以下の二点です。 1.VisualStudio等の統合開発環境との連携 2.ADO.NET(含むデータバインディング)との連携 1.に関しては言わずもがなです。ウィザードやプロ…

IL EmitによるAOP (4)

s2dotnetでのAOPを実現する機能の概略に関してもう一度書いてみます。 1.定義されたアスペクト、アドバイスからそれぞれのオブジェクトを生成する 2.アスペクトの適用対象となる型の全てのメッセージをインターセプトする 3.メッセージをインターセプトした…

IL書換えの手段が欲しい

徒労に終わったIL Emitによるs2dotnetのAOP機能ですが、一通り試してみて思ったのは透過Proxyによらないメソッドインターセプションを実現するためには"型の生成"ではなく"型の書換え"が必要だということです。Sesar2ではcglib、最近の版ではjavassistを利用…

IL EmissionによるAOP (1)

以前に日記で言及したことがある.NETにおけるDIコンテナ上のAOPの実現ですが拙作のフレームワークはS2.NETと同様にRealProxyを使用した"Proxy"方式のAOPを実装しています。現在の.NETプラットホームで可能なAOP実装のまとめこの手法はRealProxyの派生型はそ…

IL EmitによるAOP (2)

.NET上でRealProxyを利用する以外に私が考えられるAOPの実現方法はあと二つあります。現在の.NETプラットホームで可能なAOP実装のまとめより Annotation 方式 TypeEmission 方式 よりシンプルに、RealProxy方式に負けず劣らず簡単に使用できることを考えると…

IL EmitによるAOP (3)

ProxyFactoryは元の型を拡張した別な型とその実装を生成すると書きましたが実際にどのような型が生成されているのでしょう。前回書いた方法で動的に生成された型を物理的なアセンブリとして出力できることが解ったので実際に出力されたアセンブリを.NET Refl…

Injection parameter conversion

DIコンテナ(on.NET)におけるコンストラクタやプロパティ、メソッドのパラメタを使ってインジェクションする場合に設定ファイルでの指定をより柔軟に行えないかなぁと考えているのです。例えば以下のようなインタフェースがあったとします。 public interface…