处理具有通用类约束的多个EF核心存储库的依赖项注入

时间:2020-08-06 18:47:01

标签: entity-framework .net-core dependency-injection

我正在尝试将项目从.net 4.6.2升级到.net Core。当前版本将EF6与Autofac依赖项注入结合使用。我正在尝试升级项目以使用内置的.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>);

0 个答案:

没有答案