我试图理解依赖注入。 我已经为此创建了一个示例。 任何人都可以告诉,这个例子是否正确
public interface IEngine
{
void Start();
void SayHelloFromEngine();
};
public class Engine :IEngine
{
public Engine(){
}
public void Start()
{
Console.Write ("Hey it is started");
}
public void SayHelloFromEngine()
{
Console.Write ("Hello from Engine");
}
}
public class Car
{
private readonly IEngine _engine;
public Car(IEngine engine){
_engine=engine;
_engine.SayHelloFromEngine ();
}
}
我的对象创建将是
Car car2 = new Car (new Engine ());
请指导我做错的步骤。
答案 0 :(得分:0)
你的例子对我来说很好看。这就是我倾向于构建事物的方式。
有一个很好的堆栈溢出线程here,其中包含一些有用的链接和帖子。
我猜测的是,你是如何创建实现和管理依赖项的。您可以创建自己的工厂类/方法来执行此操作,也可以使用现有框架,例如Ninject。
答案 1 :(得分:0)
将保护子句添加到具有依赖关系的构造函数中是很常见的,这样如果有人试图传入null依赖关系,就可以立即抛出异常。
public class Car
{
private readonly IEngine _engine;
public Car(IEngine engine)
{
if (engine == null)
{
throw new ArgumentNullException("engine");
}
_engine=engine;
_engine.SayHelloFromEngine ();
}
}
依赖注入的一个重要部分是如何创建依赖项。当你说Car car2 = new Car (new Engine ());
时,你很难对你的依赖进行编码,这有点挫败了依赖注入的目的。您应该有一个composition root,其中定义了所有依赖项。如果你不确定自己是否正确地做了什么,那么一个好的经验法则是你不应该在任何地方new
任何依赖。{/ p>
还有一件事;当你编写你的依赖关系时,请确保你不会陷入制作service locator.
的陷阱