やっぱりやっちゃった

DIコンテナに登録するコンポーネントのクラスに特定のインタフェースを入出力するプロパティを追加した事をすっかり忘れていた。そのままテストをしたらDIコンテナに「該当のインタフェースはコンポーネントとして複数回登録されているのでバインドできないよ」と怒られた。そのインタフェースを実装するクラスがコンポーネントとして複数登録されていたのが原因なのだが暫くそれには気がつかなかった。オートバインディングは階層下のコンポーネント依存性のみ許可、とかローカルルールを作らないと駄目なのかもしれない。

追記:
上記のようなトラブルを防ぐ対策としては上記のようにルールを作る他にもいろいろあるけど新しいSesar2の目玉の一つであるアノテーションによるDIの属性の指定は非常に効果が高いのではないだろうか。.NETでの例になるがやり方としては設定ファイルで記述できる語彙に対応したプロパティを持つアトリビュートクラスを用意しても良いし以下のようにごく単純なアトリビュートクラスにしても良いと思う。

コンポーネントの自動バインディングを禁止するアトリビュートを指定する例

[AutoBinding(AutoBindingMode.None)]
public class Foo : IFoo
{  〜
}

こうすれば設定ファイルの記述にバインディングは左右されないし少なくともクラスの定義を確認すればバインディングが自動に行なわれないことが明確だ。