需要澄清依赖倒置示例

时间:2016-07-27 14:39:45

标签: dependency-injection inversion-of-control

我试图理解依赖注入。 我已经为此创建了一个示例。 任何人都可以告诉,这个例子是否正确

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 ());

请指导我做错的步骤。

2 个答案:

答案 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.

的陷阱