【问题标题】:Depenendcy Injection with abstract class抽象类的依赖注入
【发布时间】:2021-09-01 05:23:17
【问题描述】:

以这个简单的抽象示例为例,抽象类具有通用逻辑的实现,而派生类具有抽象方法的覆盖。

public abstract class Animal {
    
    public abstract void Sound();
    
    public void Sleep() {
        Console.WriteLine("Zzz");
    }
}

public class Cat : Animal {
    public override void Sound() {
        Console.WriteLine("Meow");
    }
}

public class Dog : Animal {
    public override void Sound() {
        Console.WriteLine("Woof");
    }
}

为了使用派生类之一:

Cat cat = new Cat();
cat.Sound(); // Overriden logic
cat.Sleep(); // Common logic

我的问题是在使用依赖注入时这将如何转换。在这里,我知道如何注册依赖项并通过构造函数注入将它们传递给一个类。然而让我感到困惑的是,DP 使用接口来解耦实现。显然上面的例子不是这样的,所以为了能够注入任何一个派生类,它是否像从一个看起来像这样的接口继承的基类一样简单:

public interface IAnimal {
    void Sound()'
    
    void Sleep();
}

这种方法有什么问题吗,因为它提供了对通用逻辑的访问,同时仍然启用了 unqiue 行为?当两个类共享公共逻辑但需要自己的特定方法实现时,是否有更好的解决方案或设计模式可以使用。

【问题讨论】:

  • However what confuses me, is that DP uses interfaces to decouple the implementation. 不一定。你可以依赖一个类而不是一个接口。
  • 为什么一个类会依赖Animal而不是Cat
  • 我记得有人说依赖注入是 5 美分概念的 25 美元术语。您的示例对于依赖注入并没有真正意义,毕竟它的原则是“我不在乎谁负责创建 Cat ,我只想听它喵喵叫。” - 并且那个类(不是从Animal 派生的)丢失了。这是关于调用某事,而不是定义其行为

标签: c# dependency-injection abstraction


【解决方案1】:

很明显,但是为什么不让抽象类继承一个接口呢?然后在 DP 中,您可以像往常一样为该接口传递您想要的任何子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多