控制反转和依赖注入——我需要你的建议

Inversion of Control and Dependency Injection - I need your advice

我写了一个小例子来自学IoC和DI。 我有一个简单的问题:

在我的示例中,您将如何实例化非熟练工人/

我如何在以下 2 个注入候选之间切换?:

kernal.Bind<IRepair>().To<Employee>();

kernal.Bind<IRepair>().To<UnskilledWorker>() 

我现在有点迷茫...

    class Program
    {
        static void Main(string[] args)
        {
            IWorkShop instance = GetWorkShop();
            instance.StartToRepair();

            Console.ReadLine();
        }

        private static IWorkShop GetWorkShop()
        {
            Ninject.IKernel kernal = new StandardKernel();
            kernal.Bind<IWorkShop>().To<WorkShop>();
            kernal.Bind<IRepair>().To<Employee>();


            var instance = kernal.Get<IWorkShop>();
            return instance;
        }
    }

    public class WorkShop : IWorkShop
    {
        private IRepair _repair;

        public WorkShop(IRepair repair)
        {
            _repair = repair;
        }

        public void StartToRepair()
        {
            _repair.RepairItNow();
        }
    }


    interface IWorkShop
    {
        void StartToRepair();
    }


    public class Employee : IRepair
    {
        public void RepairItNow()
        {
            Console.WriteLine("Employee starts working.");
        }
    }

    public class UnskilledWorker : IRepair
    {
        public void RepairItNow()
        {
            Console.WriteLine("Unskilled worker starts working.");

        }
    }


    public interface IRepair
    {
        void RepairItNow();
    }
}

如果您在编译时知道,那么您可以使用 Ninject 的上下文绑定:https://github.com/ninject/ninject/wiki/Contextual-Binding.

IKernel kernal = new StandardKernel();
kernal.Bind<IWorkShop>().To<WorkShop>();
kernal.Bind<IRepair>().To<Employee>();
kernal.Bind<IRepair>().To<UnskilledWorker>().WhenInjectedInto(typeof(IWorkShop));

var instance = kernal.Get<IWorkShop>();
return instance;

如果您需要在运行时决定实例化哪个依赖项,您将不得不使用工厂模式。