.NET Core DI如何注入实现接口的抽象类对应的派生类实例
问题原因
你当前的注册逻辑存在两个核心错误:
- 抽象类无法被直接实例化,你将
IStorageTableQueryHelper的实现指向抽象类StorageTableQueryAbstractHelper,DI 容器在构造实例时会直接失败。 - 你没有将抽象类、接口和可实例化的派生类
StorageTableQueryHelper做关联绑定,DI 容器无法知道要给抽象类类型的依赖返回什么实例。
解决方案
1. 修正 DI 注册逻辑
你需要先注册可实例化的派生类,再将抽象类和接口的服务指向该派生类的实例,保证三类依赖返回的是同一个实例:
// 首先注册你用到的ITableService实现,否则派生类构造会失败 services.AddScoped<ITableService, 你的TableService实现类名>(); // 注册派生类作为自身服务 services.AddScoped<StorageTableQueryHelper>(); // 绑定抽象类到派生类实例 services.AddScoped<StorageTableQueryAbstractHelper>(sp => sp.GetRequiredService<StorageTableQueryHelper>()); // 如果还需要支持注入接口IStorageTableQueryHelper,新增这行绑定 services.AddScoped<IStorageTableQueryHelper>(sp => sp.GetRequiredService<StorageTableQueryHelper>());
2. 修正派生类的重写语法错误
你当前派生类里重写的 ExecuteTableQueryAsyncClass 方法缺少抽象类定义要求的 new() 约束,会导致编译失败,需要补全:
// 第一个重载补new() public override async Task<ContinuationTokenPageResult<T>> ExecuteTableQueryAsyncClass<T>(Expression<Func<TableEntity, bool>> expression, List<string> selectField) where T : class, new() { // 你的业务逻辑 return null; } // 第二个重载补new() public override async Task<ContinuationTokenPageResult<T>> ExecuteTableQueryAsyncClass<T>(string query, List<string> selectField) where T : class, new() { // 你的业务逻辑 return null; }
3. 消费端使用
注册完成后,你在消费类注入抽象类就可以正常使用所有成员(包括接口继承来的和抽象类自己定义的):
public class EShopBusinessLogicProcessor : IEShopBusinessLogicProcessor { private readonly StorageTableQueryAbstractHelper _storageTableQueryHelper; public EShopBusinessLogicProcessor(StorageTableQueryAbstractHelper storageTableQueryHelper) { _storageTableQueryHelper = storageTableQueryHelper; } public async Task Demo() { // 可调用接口定义的Connect方法 _storageTableQueryHelper.Connect("你的连接串", "你的表名"); // 也可调用抽象类独有的ExecuteTableQueryAsyncClass方法 var result = await _storageTableQueryHelper.ExecuteTableQueryAsyncClass<TestClass>(null, null); } }
内容的提问来源于stack exchange,提问作者Dinesh Tripathi
相关产品推荐
相关产品推荐

