AspNetCore Boilerplate框架:控制器调用服务失败及配置疑问
在ASP.NET Core Boilerplate中解决控制器无法调用服务的问题
我来帮你搞定这个控制器调用服务的问题,在ABP框架里其实遵循它的依赖注入约定就可以轻松解决,咱们一步步梳理:
首先,ABP的自动依赖注入是首选
ABP框架默认提供了自动依赖注入机制,只要你的服务符合它的约定,就不需要手动在Startup.cs里配置,它会自动帮你注册:
- 你的
EmployeeService必须是public访问修饰符(看你贴的代码已经满足了,这点很重要,别不小心写成internal) - 服务类必须实现对应的接口,并且命名要匹配(比如
EmployeeService对应IEmployeeService,你也满足了) - 服务所在的类库要被ABP的模块扫描到
怎么确保服务被模块扫描到?
如果你的服务在单独的应用类库(比如HRIS.Application)里,那这个类库对应的模块类(比如HRISApplicationModule)里要加上自动扫描的代码:
[DependsOn(typeof(AbpAspNetCoreModule))] public class HRISApplicationModule : AbpModule { public override void Initialize() { // 扫描当前模块所在程序集的所有符合约定的服务 IocManager.RegisterAssemblyByConvention(typeof(HRISApplicationModule).Assembly); } }
同时,你的Web模块(比如HRISWebModule)必须依赖这个应用模块,不然ABP不会加载它:
[DependsOn(typeof(HRISApplicationModule), typeof(AbpAspNetCoreMvcModule))] public class HRISWebModule : AbpModule { // 这里可以放Web模块的配置代码 }
如果自动注册没生效,手动注册兜底
要是自动注册出问题了,你也可以手动注册服务,有两种方式:
方式1:用ABP的IocManager(推荐做法)
在应用模块的Initialize或者PreInitialize方法里添加:
IocManager.Register<IEmployeeService, EmployeeService>(DependencyLifeStyle.Transient); // 或者根据你的需求用Singleton、Scoped生命周期
方式2:用ASP.NET Core原生DI(不推荐,但也能用)
在Startup.cs的ConfigureServices方法里添加:
services.AddTransient<IEmployeeService, EmployeeService>();
最后检查你的控制器代码
你贴的控制器代码是没问题的:
- 继承了
HRISControllerBase(确保它是继承自ABP的AbpController) - 构造函数注入
IEmployeeService的写法完全正确
只要前面的依赖注入配置好了,控制器就能正常调用_employeeService里的CreateEmployee和GetEmployeeList方法了。
内容的提问来源于stack exchange,提问作者shamim
相关产品推荐
相关产品推荐

