У меня есть следующие обобщения (код удален для краткости, я не думаю, что это необходимо для вопроса):
// ## 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
К сожалению, теперь у меня есть дублирование кода, так как мне нужно заново реализовать интерфейс.
Есть ли способ обойти это?