C# 控制反转和依赖注入-我需要你的建议
我自己写了一个小例子来学习IoC和DI。 我有一个简单的问题: 在我的示例/ 我如何在以下两个注射候选人之间切换: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
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;