Ninject1.0

.NETで動作するDIコンテナNinject」が公開されていました。

  • 特徴
    • 属性ベース(XMLなし)
    • インジェクション方式は、コンストラクタメソッド、フィールド。
    • インスタンス方式は、シングルトン、スレッド毎、リクエスト毎。
    • Silverlight用(123KB)や、コンパクトフレームワーク用もあり。
    • AOPは無いように見えたけど、もしかしたらあるかも。
    • 忍者の絵のTシャツを売っていたり、サンプルコードがサムライだったり。。
  • コード例(C#
class Samurai {
  private IWeapon _weapon;

  [Inject]
  public Samurai(IWeapon weapon) {
    _weapon = weapon;
  }

  public void Attack(string target) {
    _weapon.Hit(target);
  }
}

詳細はこの辺にありますが、コードのイメージとしては、流れるようなインターフェースを意識しているそうです。また、実装の型にも注目しているようで、ひとつのインターフェースに対して、複数の実装を切り替えてインジェクションすることもできます。

//赤
Bind<IService>().To<RedImpl>().Only(When.Context.Target.HasAttribute<RedAttribute>());

class ConsumerA {
  public ConsumerA([Red] IService service) {
    // 引数の"service"にはRedImplが設定される
  }
}

//青
Bind<IService>().To<BlueImpl>().Only(When.Context.Target.HasAttribute<BlueAttribute>());

class ConsumerB {
  public ConsumerB([Blue] IService service) {
    // 引数の"service"にはBlueImplが設定される
  }
}
 

DLLのサイズが小さいところ、実装クラスの切り替えが簡単なところが面白そうに思いました。