依赖注入问题

时间:2016-12-24 13:03:38

标签: c# dependency-injection solid-principles

我刚刚进入了依赖倒置原理和控制反转,而且从我目前所知(如果我错了,请纠正我)是DIP声明

  

高级模块/类不应该依赖于低级模块/类

     

高级和低级模块都不应该依赖于细节(不确定这是什么意思?),而是抽象(接口)

但是当我编写一个简单的程序来实现这个原则时,我遇到了一个问题(稍后会解释)

我的程序包含一个实现“ICharacterable”

的Inventory和Player类
      class Player : ICharacterable {

    private int _health = 100;

    public int Health{

        get{
            return _health;
        }

    }

    public int HealthIncrease(int health){
        //increase health
        return _health + health;

    }


}

class Inventory{

    ICharacterable player = null;

    //constructor injection
    public Inventory(ICharacterable player) {

        this.player = player;

    }

    //increase player health
    public void UseHealthPotion(int health) {

        player.HealthIncrease(health);

    }

}

class Program{
static void Main(string[] args) {

    Player john = new Player();
    Inventory inv = new Inventory(john);

    inv.UseHealthPotion(30);
    Console.WriteLine(john.Health);

}

}

 //interface
public interface ICharacterable {

    int HealthIncrease(int health);

}

问题是,控制台返回100而不是130.我认为问题是由于我声明注入ICharacterable类型而不是播放器(但这会违反DIP)引起的,无论如何我可以这样做吗?感谢

2 个答案:

答案 0 :(得分:2)

这不是依赖注入问题,你在这里的代码中只有一个错误:

   public int HealthIncrease(int health){
        //increase health
        return _health += health;

    }

答案 1 :(得分:1)

结果不好,因为您的方法只返回添加结果而不更改对象的状态。其他一切都是正确的。将其更改为:

public int HealthIncrease(int health){
    //increase health
    _health += health;
    return _health;
}

你应该只考虑小替换,在我看来播放器应该包含库存,而不是反过来。然后你将遵循OOP设计模式,你的代码会更好。

  

高级模块/类不应该依赖于低级别   模块/类

在这种情况下播放器 =高级别课程和广告资源 =低级别课程

  

高级和低级模块都不应该依赖于细节(不确定这是什么意思?),而是抽象(接口)

快速解释:

抽象 =界面或抽象类。非常容易理解,它是您的 ICharactable 界面。

详细信息 =实施。这是您的库存类。是什么让你的代码与这个原则兼容。