Generi c Интерфейс, внедрение и внедрение зависимостей - тип реализации не может быть преобразован в тип сервиса - PullRequest
0 голосов
/ 03 марта 2020

У меня есть следующие обобщения (код удален для краткости, я не думаю, что это необходимо для вопроса):

// ## Entity interface

public interface IEntity<TPrimaryKey>
{
    TPrimaryKey Id { get; set; }
}

// ## Entity implementations

public class Entity<TPrimaryKey> : IEntity<TPrimaryKey> { ... }

public class Entity : Entity<string> { ... }

// ## Repo interfaces

public interface IAsyncRepository<TPrimaryKey, TEntity>
    where TEntity : Entity<TPrimaryKey> { ... }

public interface IAsyncRepository<TEntity> : IAsyncRepository<string, TEntity>
    where TEntity : Entity<string> {...}

// ## Repo implementations

public class AsyncRepository<TPrimaryKey, TEntity>
    : IAsyncRepository<TPrimaryKey, TEntity>
        where TEntity : Entity<TPrimaryKey> { ... }

public class AsyncRepository<TEntity> : AsyncRepository<string, TEntity>
    where TEntity : Entity { ... }

Затем я вставляю зависимость AsyncRepositories следующим образом:

services.AddScoped(typeof(IAsyncRepository<>), typeof(AsyncRepository<>));
services.AddScoped(typeof(IAsyncRepository<,>), typeof(AsyncRepository<,>));

Однако, когда я пытаюсь внедрить в мою razor страницу, используя @inject IAsyncRepository<Account> accountRepository, я получаю сообщение об ошибке:

System.ArgumentException: Тип реализации 'AsyncRepository`1 [ Учетная запись] 'не может быть преобразована в тип службы' IAsyncRepository`1 [Учетная запись] '

Но, если я изменю объявление окончательного класса AsyncRepository следующим образом, оно будет работать:

public class AsyncRepository<TEntity> : IAsyncRepository<TEntity>
    where TEntity : Entity

К сожалению, теперь у меня есть дублирование кода, так как мне нужно заново реализовать интерфейс.

Есть ли способ обойти это?

1 Ответ

1 голос
/ 03 марта 2020

Ваш репозиторий должен реализовывать IAsyncRepository<TEntity>: обновите ваше объявление AsyncRepository<TEntity>:

public class AsyncRepository<TEntity> : AsyncRepository<string, TEntity>,
IAsyncRepository<TEntity>
where TEntity : Entity { ... }
...