Наследование интерфейса и разрешение Unity - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь разрешить объект через его base интерфейс с использованием Unity.Если у меня есть следующие интерфейсы и классы:

interface IFoo { }
interface IBar : IFoo { }
class MyBar : IBar { }

, и я хочу внедрить MyBar в несколько классов следующим образом:

class DoSomething
{
    public DoSomething(IFoo myBar) 
    { 
        // Execute a method from IFoo implementation 
    }
}

class DoSomethingElse
{
    public DoSomethingElse(IBar myBar) 
    { 
        // Execute a method from IBar **AND** IFoo implementation 
    }
}

Если я зарегистрирую MyBar следующим образом:

container.RegisterType<IBar, MyBar>();

Unity выдает ошибку, пытаясь найти решение для IFoo (см. Конструктор DoSomething).Но IBar наследуется от IFoo?

Я мог бы дважды зарегистрировать MyBar в контейнере следующим образом:

container.RegisterType<IFoo, MyBar>();
container.RegisterType<IBar, MyBar>();

, но мне кажется, что я не должен был этого делать.Я могу ошибаться.

Итак, мой вопрос, может ли Unity разрешить класс из своего базового интерфейса?

1 Ответ

0 голосов
/ 28 сентября 2018

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

container.RegisterType<IBar, MyBar>();

, container знает, всякий раз, когда меня просят создать какой-то экземпляр для IBar, я разрешаю этот вызов, создавая экземпляр MyBar.

Однако контейнерне знает, что делать, что делать, если его запрашивают для экземпляра IFoo, потому что не каждый IFoo является IBar.Итак, что должно быть возвращено при написании этого:

container.GetInstance<IFoo>();

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

Вот почему у вас естьопределить сопоставление для обоих интерфейсов.

...