正确使用依赖注入

时间:2020-01-24 19:08:50

标签: c# dependency-injection dependencies code-injection

我一直在使用依赖项注入,并且注意到在构造函数(您要注入的)中,参数通常是接口或基类。我想我理解参数是接口还是基类的原因。但是,我意识到有时尝试插入的实际类/对象可能会使用接口或基类都不应该具有的方法(因为只有我要实例化的实际类/对象才应具有该方法) 。但是如果是这种情况,这意味着如果注入的参数是接口或基类,则无法调用该方法。我是否应该只创建另一个接口,该接口包含要在要实例化的实际类/对象上使用的方法?我在下面有一个例子:

public interface IAnimal
{
   void Eat();
}

public abstract class Mammals : IAnimal
{
   public void Eat()
   {
      //eating code
   }

   public void Sleep()
   {
      //sleep code
   }
}

public class Whale : Mammals
{
   public void Swim()
   {
      //swim code
   }
}

public class Dog : Mammals
{
   public void Run()
   { 
      //run code
   }

}

//Injecting here
public class Class1
{
    private readonly Mammals x;
     public Class1(Mammals x)
     {
         this.x = x;
     }

     public class Method1()
     {
         x.Eat();
         x.Sleep();

         //I can't call swim() unless I do below:
         //Whale y = x;
         //y.Swim();
     }

}

我一直认为使用接口或基类(在注入注入中)可以使代码更简洁,因为如果我决定更改要注入的类/对象,则无需进行任何更改。代码,因为无论我注入什么对象都将具有接口或具有基类。但是,如果我添加了允许我使用Swim()的代码,后来又决定注入Dog类,则必须将代码更改为使用Run()。我试图充分理解依赖注入以及利用它的正确方法。我注意到我的代码绝对看起来更干净。我应该如何处理上述代码?

2 个答案:

答案 0 :(得分:1)

如果此类确实涉及任何种类的哺乳动物,并且您想让其中的一些动物游泳,那么您可以测试注入的对象是否实现了ISwim。

例如(哺乳动物为ISwim)?. Swim();

答案 1 :(得分:1)

这不完全是依赖注入问题,而是设计问题。 依赖注入用于解耦,并允许进行更好的单元测试,从而帮助使客户端与设计变更或实施的影响隔离。 对于您的问题,您可以调用Move(),该方法应该与所有哺乳动物都有关,或者按照上面的建议使用iwater哺乳动物。

相关问题