首页 > 解决方案 > 依赖注入导致不必要的实现

问题描述

我正在创建一个实现IAnimal接口的Animal类。然后,CatsDogs类都实现了 IAnimal接口。目前我在IAnimal中只保留了 3 个简单的方法来进行简短的演示。主类Animals是使用依赖注入 (DI) 构造的。

IAnimal有更多方法时,例如:Cats类只实现了SomethingOnlyCatsDo方法,Dogs类实现了SomethingOnlyDogsDo方法,那么每个类内部都会有更多不必要的实现(如Cats().CatchDisk()Dogs().CatchMouse( )在当前示例中)。

我的问题是,有什么方法可以帮助我继续使用 DI 但避免这种不必要的实现的增长?

public interface IAnimal
{
    void Sound();
    void CatchMouse();
    void CatchDisk();

    // What if there are more methods here
    //string GetOwnerName();
    //void SomethingOnlyCatsDo();
    //void SomethingOnlyDogsDo();
}

public class Cats : IAnimal
{
    public void Sound()
    {
        Console.WriteLine("Meow meow");
    }

    public void CatchMouse()
    {
        Console.WriteLine("Catching mouse");
    }

    public void CatchDisk()
    {
        throw new NotImplementedException();
    }
}

public class Dogs : IAnimal
{
    public void Sound()
    {
        Console.WriteLine("Woof woof");
    }

    public void CatchDisk()
    {
        Console.WriteLine("Catching disk");
    }

    public void CatchMouse()
    {
        throw new NotImplementedException();
    }
}

// Main class
public class Animals
{
    private readonly IAnimal _animal;

    public Animals(IAnimal animal)
    {
        _animal = animal;
    }

    public void Sound()
    {
        _animal.Sound();
    }

    public void CatchADisk()
    {
        _animal.CatchDisk();
    }

    public void CatchAMouse()
    {
        _animal.CatchMouse();
    }
}

标签: c#.netdependency-injection

解决方案


如果遵循 SOLID 原则,尤其是 I(Interface Segregation,https://en.wikipedia.org/wiki/Interface_segregation_principle),IAnimal不应该有 CatchDiskor CatchMouse方法。相反,您应该拥有 IAnimalSound()方法,以及单独的接口 ICatchesMouseICatchesDisk. 这样就 Animal不必实现不必要的方法。


推荐阅读