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の拡張ライブラリを使うか自分でコンポーネントつくるかすればrubyやxmlなどで記述した設定を読めたりすることもできそう。
[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("忍者"), "忍者を切りつけた"); }