Что происходит, когда интерфейс реализован более одного раза с одной и той же сигнатурой метода, но с разными результатами? - PullRequest
0 голосов
/ 06 декабря 2018

* Я знаю, что вопрос звучит неловко, но я не мог придумать, как его сформулировать.

Я смотрю на проект, который использует Castle Windsor IoC, когда я сталкиваюсь со следующим сценарием.

public class ParentClass
{
    private readonly ICommonInterface _commonInterface;
    public ParentClass(ICommonInterface commonInterface)
    {
        this._commonInterface = commonInterface;
    }
}

Теперь это, очевидно, не замечательно, но когда я посмотрел, что реализует этот интерфейс, я обнаружил следующее:

public interface ICommonInterface
{
    void DoWork();
}

public class Class1 : ICommonInterface
{
    public void DoWork()
    {
       //Do x;
    }
}

public class Class2 : ICommonInterface
{
    public void DoWork()
    {
        //Do y;
    }
}

Должны ли быть вызваны оба этих метода?Здесь есть что-то, что я должен увидеть, но нет?Когда я пытался воспроизвести это, используя встроенный контейнер .NetCore, выполнялся только y.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Когда существует несколько классов, реализующих один и тот же интерфейс, различные контейнеры DI обрабатывают эту ситуацию по-своему.

  • Некоторые используют первую регистрацию
  • Некоторые используют последнюю регистрацию
  • Некоторые выдают исключение, потому что служба неоднозначна
  • Некоторые используют специальную регистрацию, которая помечена как регистрация по умолчанию

Могут быть другие стратегии для обработки этогосценарий также (например, Виндзор изначально понимает декораторы и композиты), но я считаю, что это основные способы поведения.

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

0 голосов
/ 06 декабря 2018

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

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

...