DI не разрешает базовый интерфейс из подчиненного интерфейса - PullRequest
1 голос
/ 31 мая 2019

У меня довольно простая настройка для дизайна репозитория.Использование DI для разрешения хранилищ в конструкторах контроллеров.

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

Интересно знать, знает ли кто-нибудь, почему это может происходить?

Пример:

Базовый интерфейс

public interface IReadOnlyRepository<T>
{
    void DoSomething();
}

Подинтерфейс

public interface IReadWriteRepository<T> : IReadOnlyRepository<T>
{
    void DoSomethingElse();
}

Реализация

public class AccountRepository: IReadWriteRepository<Account>
{
    public void DoSomething() { /* BLAH */ }
    public void DoSomethingElse() { /* BLAH */ }
}

Регистрация

services.AddTransient<IReadWriteRepository<Account>, AccountRepository>();

Разрешение

provider.Resolve<IReadWriteRepository<Account>>(); // SUCCEEDS :)
provider.Resolve<IReadOnlyRepository<Account>>(); // FAILS! :(

1 Ответ

3 голосов
/ 31 мая 2019

Это не то, как работает внедрение зависимостей. Если вы хотите, чтобы IReadOnlyRepository<Account> было разрешено до AccountRepository, вам также придется это зарегистрировать.

services.AddTransient<IReadOnlyRepository<Account>, AccountRepository>();

В противном случае, как контейнер DI узнает, что генерировать. Представьте, что, по вашему мнению, сработает, что произойдет, если вы попросите разрешить IDisposable или IEnumerable? Он не может волшебным образом знать, что вам нужно, вы должны быть явными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...