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

C# 控制反转和依赖注入-我需要你的建议,c#,dependency-injection,ninject,inversion-of-control,C#,Dependency Injection,Ninject,Inversion Of Control,我自己写了一个小例子来学习IoC和DI。 我有一个简单的问题: 在我的示例/ 我如何在以下两个注射候选人之间切换: kernal.Bind<IRepair>().To<Employee>(); kernal.Bind<IRepair>().To<UnskilledWorker>() kernal.Bind().To(); kernal.Bind()到() 我现在有点困惑 class Program { sta

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

在我的示例/

我如何在以下两个注射候选人之间切换:

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

kernal.Bind<IRepair>().To<UnskilledWorker>() 
kernal.Bind().To();
kernal.Bind()到()
我现在有点困惑

    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();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
IWorkShop实例=GetWorkShop();
instance.StartToRepair();
Console.ReadLine();
}
私人静态IWorkShop GetWorkShop()
{
Ninject.IKernel kernal=新的标准内核();
内核绑定()到();
内核绑定()到();
var instance=kernal.Get();
返回实例;
}
}
公开课工作坊:IWorkShop
{
私人维修;
公共工作坊(维修)
{
_修理=修理;
}
公共空间开始修复()
{
_repair.RepairItNow();
}
}
界面工场
{
无效开始修复();
}
公共类员工:IRepair
{
公共网站
{
Console.WriteLine(“员工开始工作”);
}
}
公共类非熟练工人:IRepair
{
公共网站
{
控制台.WriteLine(“非熟练工人开始工作”);
}
}
公共接口对
{
无效修复现在();
}
}

如果您在编译时知道,那么可以使用Ninject的上下文绑定:

IKernel kernal=新标准内核();
内核绑定()到();
内核绑定()到();
内核.Bind().To().whenInjectedTo(typeof(IWorkShop));
var instance=kernal.Get();
返回实例;

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

嗨,Jason,谢谢您的回答。我发现可以调用kernal.GetAll()。因此,您可以注册它们并获得所有绑定的IEnumerable。工厂模式也可能是一个解决方案,没错。
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;