Обработка внедрения зависимостей для нескольких репозиториев EF Core с ограничениями класса generi c - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь обновить проект с. net 4.6.2 до net Core. Текущая версия использует EF6 с внедрением зависимостей Autofa c. Я пытаюсь обновить проект, чтобы использовать встроенный Net Core DI, а также EF Core. У меня возникают проблемы с настройкой внедрения зависимостей. NET Core. Я получаю сообщения об ошибках, связанных с ограничением класса для репозиториев, которые принимают дженерики.

Вот два моих репозитория:

    public partial class CustomerRepository<T> : EfRepository<T> where T : CustomerBaseEntity
    {
        public CustomerRepository(CustomerDbContext context) : base(context)
        {
        }
    }

    public partial class OrderRepository<T> : EfRepository<T> where T : OrderBaseEntity
    {
        public OrderRepository(OrderDbContext context) : base(context)
        {
        }
    }

Вот мой класс EFRepository:

public class EfRepository<T> : IRepository<T>
        where T : BaseEntity
{
    private readonly DbContext _context;
    private DbSet<T> _entities;

    public EfRepository(DbContext context)
    {
        _context = context;
    }
    .... <additional methods not included> ....
}

Сущности:

public class CustomerBaseEntity : BaseEntity
{
}

public class OrderBaseEntity : BaseEntity
{
}

public class CustomerEntity : CustomerBaseEntity
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class OrderEntity : OrderBaseEntity
{
    public int ID { get; set; }
    public string Name { get; set; }
}

Вот мой код для внедрения зависимостей:

//DBContext
services.AddDbContext<CustomerDbContext>(options => options.UseSqlServer(configuration["ConnectionStrings:CustomerDB"]));
services.AddDbContext<OrderDbContext>(options => options.UseSqlServer(configuration["ConnectionStrings:OrderDB"]));

//Repositories
services.AddScoped(typeof(IRepository<>), typeof(CustomerRepository<>));
services.AddScoped(typeof(IRepository<>), typeof(OrderRepository<>));

Вот ошибка, которую я получаю:

System.ArgumentException: GenericArguments[0], 'OrderEntity', on 'CustomerRepository`1[T]' violates the constraint of type 'T'.

Может ли кто-нибудь помочь мне понять, как я могу сообщить DI, что CustomerRepository должен вводить только типы сущностей, унаследованные от «CustomerBaseEntity», а OrderRepository должен внедрять только типы сущностей, унаследованные от «OrderBaseEntity»?

*** Обновить : Я также пробовал следующий код DI (оба безуспешно):

services.AddScoped(typeof(IRepository<CustomerBaseEntity>), typeof(CustomerRepository<CustomerBaseEntity>));
services.AddScoped(typeof(IRepository<OrderBaseEntity>), typeof(OrderRepository<OrderBaseEntity>));

and

services.AddScoped(IRepository<CustomerBaseEntity>, CustomerRepository<CustomerBaseEntity>);
services.AddScoped(IRepository<OrderBaseEntity>, OrderRepository<OrderBaseEntity>);
...