我正在尝试将项目从.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>);