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

时间:2017-01-03 17:27:27

标签: c# dependency-injection ninject inversion-of-control

我写了一个小例子来自学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();
    }
}

1 个答案:

答案 0 :(得分:2)

如果您在编译时知道,那么您可以使用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;

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