【问题标题】:Dependency Injection : Using Constructor Injection依赖注入:使用构造函数注入
【发布时间】:2016-09-22 09:34:36
【问题描述】:

昨天,我的一个朋友让我创建一个程序(必须实现依赖注入)来返回汽车的速度。所以,我创建了一个小程序,我厌倦了在其中实现构造函数注入。

 class Program
{
    static void Main(string[] args)
    {
        Maruti objMaruti = new Maruti();
        clientClass obj = new clientClass(objMaruti);
        obj.getSpeed();
    }
}

public class clientClass
{
    ISpeed _ISpeed;
    public clientClass(ISpeed obj)
    {
        this._ISpeed = obj;
    }

    public int getSpeed()
    {
        return _ISpeed.Speed();
    }

}

public interface ISpeed
{
    int Speed();
}

public class Maruti : ISpeed
{
    public int Speed()
    {
        return 200;
    }
}
public class Audi : ISpeed
{
    public int Speed()
    {
        return 400;
    }
}
public class BMW : ISpeed
{
    public int Speed()
    {
        return 600;
    }
}

现在,在 main 方法中,我的朋友可以检查任何汽车的速度。

 class Program
{
    static void Main(string[] args)
    {
        Maruti objMaruti = new Maruti();
        clientClass obj = new clientClass(objMaruti);
        obj.getSpeed();
    }
}

他问我一个问题,你为什么要创建这个构造函数注入和客户端类。如果直接调用类,就会得到结果。

 class Program
{
    static void Main(string[] args)
    {
        Maruti objMaruti = new Maruti();
        objMaruti.Speed();

        //If user wants to check Audi Speed.
        Audi objAudi = new Audi();
        objAudi.Speed();
    }
}

他说的对吗?哪种方式最好,为什么?

【问题讨论】:

  • 他的下一个问题是你为什么使用 OOP,因为你可以使用过程或函数式编程?这是一个依赖倒置的例子。
  • 如果您接受 ISpeedUsingProvider 作为参数,该示例会更好。 clientClass 在某处使用了.getSpeed() 方法,但没有Speed() 方法。你写的例子是依赖倒置的例子,如上所述。

标签: c# dependency-injection interface


【解决方案1】:

我认为糟糕的命名让你的朋友问你这个问题。如果您需要记录不同汽车的速度怎么办?客户端类将具有此名称

public class SpeedLog
{
   ISpeed speed;
   ILogger logger;
   public SpeedLog(ISpeed speed, ILogger logger)
   {
       this.speed = speed;
       this.logger = logger;
   }
   public void Information()
   {
       logger.Information($"{speed.GetType().Name} is running with {speed.Speed()}");
   }
}

只要对象在其公共接口中具有Speed 方法,此客户端类就可以记录任何对象的速度。 ISpeed 接口让我们有机会定义Speed 方法的签名。现在SpeedLog 类型不依赖于特定类型,如MarutiAudi,甚至不依赖于基本类型Car(如果有)来检索速度信息。如果Star 类型实现ISpeed 接口,SpeedLog 现在可以记录星星的速度。当我们添加新的Star 类型时,我们只需要编译包含此类型的库,SpeedLog 类型的库保持不变。如果要求,控制反转库现在可以注入 Star 对象。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2019-04-20
    • 2013-01-30
    • 2012-02-12
    • 2018-06-17
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多