【发布时间】: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