Зарегистрировать внедрение зависимостей для универсального класса - PullRequest
0 голосов
/ 05 сентября 2018

Итак, вот моя структура приложения:

  • Aplication
    • Repositores
  • Web
    • Услуга

У меня есть такой код хранилища

public interface IRepository<T> { }

public class Repository <T> { }

public interface ITestRepository : IRepository<Model> { }

public class TestRepository : Repository<Model>, ITestRepository { }

public interface ITest2Repository : IRepository<Model2> { }

public class Test2Repository : Repository<Model2>, ITest2Repository { }

и я использую этот репозиторий для своей службы в Интернете, например:

public class TestService : ITestService
{
     private readonly ITestRepository testRepository;
     private readonly ITest2Repository test2Repository;

     public TestService(ITestRepository testRepository, ITest2Repository test2Repository)
     {
         this.testRepository = testRepository;
         this.test2Repository = test2Repository;
     }
}

Прямо сейчас я регистрирую хранилище в Startup.cs вот так.

services.AddScoped(typeof(IRepository<Model>), typeof(TestRepository));
services.AddScoped(typeof(IRepository<Model2>), typeof(Test2Repository));
services.AddScoped<ITestRepository, TestRepository>();
services.AddScoped<ITest2Repository, Test2Repository>();

и я хочу упростить это. Я недавно гуглил способ регистрации универсального класса, но он сломал мой Program.cs

вот ошибка:

System.ArgumentException: «Не удается создать экземпляр типа реализации« Application.Repositories.Repository1 [TEntity] »для типа службы« Application.Repositories.Interfaces.IRepository1 [TEntity] '.'

и вот как я могу зарегистрировать репозиторий:

services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
services.AddScoped<ITestRepository, TestRepository>();
services.AddScoped<ITest2Repository, Test2Repository>();

TL; DR, есть ли решение для упрощения моей регистрации в этом хранилище?

1 Ответ

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

Вы можете добавить свой собственный метод расширения для упрощения регистрации:

static class ServiceCollectionExtensions
{
    public static void AddRepository<TInterface, TRepository, TModel>(this IServiceCollection serviceCollection) 
        where TInterface : IRepository<TModel> 
        where TRepository : TInterface
    {
        services.AddScoped<TInterface, TRepository>();
        services.AddScoped<IRepository<TModel>, TRepository>();
    }
}

// usage:
services.AddRepository<ITestRepository, TestRepository, Model>();

Об упомянутой вами ошибке см. Комментарий Кирка:

Похоже, Repository<T> на самом деле не реализует IRepository<T> - я понимаю, почему система DI не рада этому.

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