Это расширение вопроса Зачем мне нужен контейнер IoC, а не простой код DI?
Я изучал Ninject и придумал следующий пример, пример проходит через руководство способ выполнения DI и способ выполнения DI с помощью Ninject:
class Program
{
static void Main(string[] args)
{
NinjectWay();
ManualWay();
Console.ReadKey();
}
private static void ManualWay()
{
Console.WriteLine("ManualWay***********************");
IWeapon sword = new Sword();
Samurai samurai = new Samurai(sword);
Console.WriteLine(samurai.Attack("ManualWay..."));
// change weapon
IWeapon dagger = new Dagger();
samurai.Weapon = dagger;
Console.WriteLine(samurai.Attack("ManualWay..."));
IWeapon weapon = new Shuriken();
IWarrior ninja = new Ninja(weapon);
Console.WriteLine("Manual way.. inject shuriken when a ninja. " + ninja.Weapon.Name);
IWarrior ninja2 = new Ninja(weapon);
}
private static void NinjectWay()
{
Console.WriteLine("NinjectWay***********************");
IKernel kernel = new StandardKernel();
kernel.Bind().To();
var samurai = kernel.Get();
Console.WriteLine(samurai.Attack("NinjectWay..."));
kernel.Rebind().To();
samurai = kernel.Get();
Console.WriteLine(samurai.Attack("NinjectWay..."));
kernel.Bind().To().WhenInjectedInto();
var ninja = kernel.Get();
ninja.OffHandWeapon = new ShortSword();
Console.WriteLine("Conditional Injection..."+ninja.Weapon.Name);
Console.WriteLine("Conditional Injection: OffhandWeapon = " + ninja.OffHandWeapon.Name);
var ninja2 = kernel.Get();
Console.WriteLine("Conditional Injection..." + ninja2.Weapon.Name);
Console.WriteLine("Conditional Injection: OffhandWeapon = " + ninja2.OffHandWeapon.Name);
Console.WriteLine("");
}
}
Я слышал, что выгоды появляются, когда масштаб проекта увеличивается, но я этого не вижу. Помогите мне лучше понять это. Приведите больше примеров на C # / Ninject и помогите мне понять, где преимущества действительно проявляются.