正确使用依赖注入



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

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();
}
}

我一直认为使用接口或基类(在 depedency 注入中(可以让你制作更干净的代码,因为如果我决定更改我注入的类/对象,我不必对代码进行任何更改,因为我注入的任何对象要么具有接口,要么具有基类。 但是,如果我添加允许我使用 Swim(( 的代码,然后决定注入 Dog 类,我将不得不更改代码以使用 Run((。 我正在尝试完全理解依赖注入以及使用它的正确方法。 我注意到我的代码肯定因此看起来更干净。 我应该如何处理上述代码的问题?

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

例如(哺乳动物作为ISwim(?。游泳((;

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

最新更新