правильное использование внедрения зависимости - PullRequest
0 голосов
/ 24 января 2020

Я использовал внедрение зависимостей, и я заметил, что в конструкторах (которые вы внедряете) параметры обычно являются интерфейсом или базовым классом. Мне кажется, я понимаю причину, по которой параметры являются интерфейсом или базовым классом. Тем не менее, я понимаю, что бывают случаи, когда фактический класс / объект, который я пытаюсь внедрить, может использовать метод, который не должен иметь ни интерфейс, ни базовый класс (поскольку только фактический класс / объект, который я создаю, должен иметь этот метод) , Но если это так, это означает, что я не могу вызвать этот метод, если введенные параметры являются интерфейсом или базовым классом. Должен ли я просто создать другой интерфейс, который будет содержать метод, который я хочу, для фактического класса / объекта, который я пытаюсь создать? У меня есть пример ниже:

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 (). Я пытаюсь полностью понять внедрение зависимости и правильный способ ее использования. Я заметил, что мои коды определенно выглядят чище из-за этого. Как я должен go о выпуске вышеуказанного кода?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Это не проблема внедрения зависимостей, а вопрос проектирования. Внедрение зависимостей предназначено для разделения и позволяет улучшить модульное тестирование, помогая изолировать клиента от влияния изменений или реализации проекта. Что касается вашего вопроса, вы можете либо вызвать Move (), и это должно относиться ко всем млекопитающим, либо использовать млекопитающих, как указано выше.

1 голос
/ 24 января 2020

Если этот класс действительно имеет дело с каким-либо видом млекопитающего, и вы хотите заставить некоторых из них плавать, то вы можете проверить, реализует ли введенный объект ISwim.

Например (млекопитающее как ISwim)? .Swim ();

...