Ninjectを使ってみた その2

モジュールを動的に読み込めます。まず、Assemblyから。

[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void Dynamic_module_loading_by_Assembly()
{
    var kernel = new StandardKernel();
    kernel.Load(AppDomain.CurrentDomain.GetAssemblies().Where(e => e.FullName.StartsWith("Client"))); // <-- ここ
    var samurai = kernel.Get<Samurai>();
    Assert.AreEqual(samurai.Attack("忍者"), "忍者を切りつけた");
}

次に、カレントディレクトリ上に存在するdllから。Ninjectの拡張ライブラリを使うか自分でコンポーネントつくるかすればrubyxmlなどで記述した設定を読めたりすることもできそう。

[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void Dynamic_module_loading_by_path()
{
    var kernel = new StandardKernel();
    kernel.Load("Client.dll"); // <-- ここ
    var samurai = kernel.Get<Samurai>();
    Assert.AreEqual(samurai.Attack("忍者"), "忍者を切りつけた");
}


Provier経由でインスタンス化できます。

[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void Providers()
{
    var kernel = new StandardKernel();
    kernel.Bind<IWeapon>().ToProvider<SwordProvider>(); // <-- ここ
    kernel.Bind<SamuraiM>().ToSelf();
    var samurai = kernel.Get<Samurai>();
    Assert.AreEqual(samurai.Attack("忍者"), "忍者を切りつけた");
}

public class SwordProvider : Provider<Sword>
{
    protected override Sword CreateInstance(IContext context)
    {
        return new Sword();
    }
}

delegateを使ってインスタンス化することもできます。上のProvider使う方法を簡易化したかんじですね。

[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void FactoryMethods()
{
    var kernel = new StandardKernel();
    kernel.Bind<IWeapon>().ToMethod(context => new Sword()); // <-- ここ
    kernel.Bind<SamuraiM>().ToSelf();
    var samurai = kernel.Get<Samurai>();
    Assert.AreEqual(samurai.Attack("忍者"), "忍者を切りつけた");
}