依赖项注入的正确使用

问题描述 投票:0回答:1

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

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()。我试图充分理解依赖注入以及利用它的正确方法。我注意到我的代码绝对看起来更干净。我应该如何处理上述代码?

c# dependency-injection dependencies code-injection
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.