ちょっと便利なAutoWiring

以下のクラスがあるとする。

namespace Hoge.Logging {
    class Logger {
    }
}

このクラスを利用するクラスとして、以下のクラスを定義する。

namespace Hoge {
    class HogeManager {
        private Logger logger;
        public Logger Logger {
            set {
                logger = value;
            }
        }
    }
}

これをSpring.NETのコンテナに登録するには、通常以下のように記述する。

<object name="logger" type="Hoge.Logging.Logger, HogeLib">
</object>

<object name="hoge" type="Hoge.HogeManager, HogeLib">
    <property name="Logger" ref="logger" />
</object>

しかし、こういうよく使うオブジェクト(ロギングオブジェクトやコネクションなど)をいろんなオブジェクトに対して、毎回propertyタグで設定するのはめんどくさい。
こんな時、AutoWiring機能を利用するとこれを省略することができる。

<object id="Logger" type="Hoge.HogeManager, HogeLib">
</object>

<object name="hoge" type="Hoge.HogeManager, HogeLib" autowire="byName">
</object>

loggerオブジェクトをのオブジェクト名をid属性で定義する(AutoWiringはid属性のオブジェクト名のみを対象にする)。
別に普段からname属性を使わずにid属性でオブジェクト名を定義すればいいのだが、AutoWiringの対象である事を明示するために、対象でないものにはname属性を使用するようにしている。
hogeオブジェクトにautowire属性を定義して値をbyNameに設定する。これでhogeオブジェクトのプロパティ名と一致するオブジェクト名のオブジェクトを検索して、自動的にセットしてくれる。

乱用するとわけがわからなくなるが、使いどころを決めておけば非常に便利な機能である。