依赖注入导致不必要的实现

时间:2018-07-09 13:14:03

标签: c# .net dependency-injection

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

IAnimal 具有更多方法时,例如: Cats 类仅实现 SomethingOnlyCatsDo 方法, Dogs 类实现 SomethingOnlyDogsDo 方法,那么每个这些类中都会有更多不必要的实现(例如 Cats()。CatchDisk() Dogs()。CatchMouse()< / em>(在当前示例中)。

我的问题是,有什么方法可以帮助我继续使用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();
    }
}

2 个答案:

答案 0 :(得分:3)

如果遵循SOLID原则,尤其是I(接口隔离,https://en.wikipedia.org/wiki/Interface_segregation_principle),则IAnimal不应具有CatchDiskCatchMouse方法。相反,您应该使用IAnimal方法使用Sound(),并分别使用接口ICatchesMouseICatchesDisk。这样,Animal无需实现不必要的方法。

答案 1 :(得分:2)

您可以使用Interface Segregation Principle

  

接口隔离原则(ISP)规定,不应强迫任何客户端依赖其不使用的方法。

您的IAnimal接口将仅具有Sound(),然后您创建一个名为ICat的新接口,该接口继承自IAnimal,此接口将具有CatchMouse()。您的课程Cats将从ICat继承。

Here's一个实际示例。