Получить зависимости от зависимости

Скажем, у меня есть PetManager и Cat:

class PetManager
{
    PetManager(IBusinessLayer businessLayer, IWashingService washingService);

    IBusinessLayer BusinessLayer;

    IWashingService WashingService;
}

class Cat
{
    Cat(PetManager manager, string name, int levelOfStupidity);
}

Теперь позвольте сказать, что моей кошке нужна моя стиральная услуга, не так ли baaaaad, чтобы получить зависимость от моего любимого менеджера?

class Cat
{
    Cat(PetManager manager, string name, int levelOfStupidity)
    {
        this.manager = manager;
        this.name = name;
        this.levelOfStupidity = levelOfStupidity;
    }

    IWashingService WashingService
    {
        get { return this.manager.WashingService; }
    }
}

Я сильно подозреваю, что да, это было бы...

+4
26 апр. '11 в 14:41
источник поделиться
4 ответа

Как указано, Cat - это конкретный класс, поэтому он может разоблачить все, что имеет смысл. Выявление аргументов конструктора как свойств только для чтения - это совершенно разумная вещь.

Однако, если Cat реализовал ICat, я бы сильно подозревал, что разоблачение зависимости, такой как PetManager через ICat, будет нечеткой абстракцией.

По сути, интерфейсы служат своего рода модификатором доступа. Имеет смысл разоблачать зависимости от конкретного класса, но не от интерфейса. Зависимости вводятся через конструктор, поэтому никогда не могут быть частью интерфейса - подпись конструктора является нашей степенью свободы.

+4
26 апр. '11 в 15:18
источник

Хорошо, если вы подписываетесь на инверсию стиля инъекции управления/зависимости (и, похоже, это возможно), вам нужно подумать о компромиссах.

Я предполагаю, что умники могут сказать, что у вас могут возникнуть проблемы с обслуживанием. Они, конечно, не выглядят скандальными, просто имея тонны параметров. Так, например, если вы использовали PetManager на 10 различных видах домашних животных, и одному из этих десяти домашних животных нужна была какая-то особая функциональность, из-за которой PetManager изменился, вы могли бы воздействовать на остальные 9 классов, которые зависят от PetManager, и поэтому было бы лучше просто вставляя зависимости отдельно.

Быть прагматичным, хотя... То, что вы делаете, - это абстрагирование связки зависимых зависимостей в другом классе и просто передача этого как способ группировки и, возможно, упрощения построения объекта. Я в порядке. Я даже вроде как это.

Полное раскрытие: я не так категорично отношусь к этому, как к другим людям. Я вполне могу быть еретиком, но меньше параметров выглядит и пахнет мне чище. У меня есть это злобное чувство, что если я спрошу меня через пять лет, я могу чувствовать по-другому, но то, где я сейчас.

+1
26 апр. '11 в 14:48
источник

Я думаю, что единственная проблема заключается в том, что кот зависит от конкретного Petmanager, если вы отриняете PetManager как услугу, способную предоставить услугу мойки, это звучит лучше для меня.

+1
26 апр. '11 в 15:00
источник

Я думаю, это зависит. Часто, когда вы обнаруживаете, что у вас есть класс SomethingManager, вы просто группируете логику в один класс, а не разделяете ее на составляющие зависимости. В вашей ситуации кажется, что у вас действительно не должно быть класса PetManager вообще, и вместо этого нужно напрямую вводить зависимости для объектов WashingService и BusinessLayer.

+1
26 апр. '11 в 14:46
источник

Посмотрите другие вопросы по меткам или Задайте вопрос