【问题标题】:proper use of dependency injection正确使用依赖注入
【发布时间】:2020-05-11 03:05:42
【问题描述】:

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

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()。我试图完全理解依赖注入和使用它的正确方法。我注意到我的代码因此看起来更干净。我应该如何处理上述代码的问题?

【问题讨论】:

  • 一种可能性是在接口中使用Move 方法抽象该概念,并让Dog 将其实现为Run,Whale 实现为Swim。
  • 但是如果某些动物(假设地)永远不会使用 Move() 会怎样。创建另一个接口是一个更好的选择,只是检查它是否在该类中实现,如果是,调用该方法(如下所述)?

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


【解决方案1】:

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

例如 (mammal as ISwim)?.Swim();

【讨论】:

  • 那么创建另一个接口?我正在考虑走那条路,只是想知道是否有更常见(更好)的方式。
  • 是的,接口隔离,SOLID 中的“我”?。您的 Whale 或 IWhale 应该实现或继承它。
【解决方案2】:

这不完全是依赖注入问题,而是设计问题。 依赖注入用于解耦并允许更好的单元测试帮助将客户端与设计更改或实现的影响隔离开来。 至于您的问题,您可以调用 Move() 并且这应该与所有哺乳动物相关,或者按照上面的建议使用 iwatermammals。

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多