最近在分析 NopCommerce 代码,发下 Nop 的 Controllers 的构造方法里都需要传入参数,依赖注入的过程我已经弄明白了,但是我跟踪调试也没有弄明白 Nop 的控制器是如何执行进去的,麻烦明白人给指条明路哈。
1 #region Constructors 2 3 public BlogController(IBlogService blogService, 4 IWorkContext workContext, 5 IStoreContext storeContext, 6 IPictureService pictureService, 7 ILocalizationService localizationService, 8 IDateTimeHelper dateTimeHelper, 9 IWorkflowMessageService workflowMessageService, 10 IWebHelper webHelper, 11 ICacheManager cacheManager, 12 ICustomerActivityService customerActivityService, 13 IStoreMappingService storeMappingService, 14 MediaSettings mediaSettings, 15 BlogSettings blogSettings, 16 LocalizationSettings localizationSettings, 17 CustomerSettings customerSettings, 18 CaptchaSettings captchaSettings) 19 { 20 this._blogService = blogService; 21 this._workContext = workContext; 22 this._storeContext = storeContext; 23 this._pictureService = pictureService; 24 this._localizationService = localizationService; 25 this._dateTimeHelper = dateTimeHelper; 26 this._workflowMessageService = workflowMessageService; 27 this._webHelper = webHelper; 28 this._cacheManager = cacheManager; 29 this._customerActivityService = customerActivityService; 30 this._storeMappingService = storeMappingService; 31 32 this._mediaSettings = mediaSettings; 33 this._blogSettings = blogSettings; 34 this._localizationSettings = localizationSettings; 35 this._customerSettings = customerSettings; 36 this._captchaSettings = captchaSettings; 37 } 38 39 #endregion
可能我上面没有说清楚,通常 MVC 直接通过路由调用控制器是不需要给路由传参的,直接初始化,但是我在 Nop 的代码里没有看到初始化传参的方法,我参考了 Nop 的架构自己写了个项目,但是在请求 UserController 的时候出现了这个问题。
在这儿 20 this._blogService = blogService; 定个断点
我的意思是这些参数是何时传入控制器的。注入进去的吗?
@Charles Zhang: “依赖注入的过程我已经弄明白了” -〉很明显,这个过程你还没弄明白!那么这里有几个问题你需要搞清楚:
1、它使用的依赖注入的框架是什么?
2、该框架使用的依赖注入的方式是什么?
3、接口的实现类在哪里?
@Launcher: 好吧,我再跟踪一下吧,就算是注入进去的不是也需要调用吗?
@Charles Zhang:
“我的意思是这些参数是何时传入控制器的” -〉构造 BlogController 实例的时候传入的。
这个回答正确,但是你觉得对你有帮助吗?因为你问的问题有问题,之所以有问题,是因为你没搞明白依赖注入。
@Charles Zhang:
“就算是注入进去的不是也需要调用吗?” -〉谁需要调用?需要调用谁?
@Launcher: 应该是我没说明白,我在缕缕。
@Charles Zhang: Nop 使用的是 Autofac ,Conroller 采用的是构造注入,要实现注入,比如有配置,这个配置可以是配置文件,也可以是代码,你可以在代码和配置文件中都去找找。
@Launcher: 我找到问题了,貌似我忘记注入数据库服务了
依赖注入,Autofac 插件在 Nop.Web.Framework 的 DependencyRegistrar 进行注入,其后编写构造器的时候添加对应的接口即可。
详情可以留意 nopCommerce中文网-教程
Nop.Web.Framework 的 DependencyRegistrar:
builder.RegisterControllers(typeFinder.GetAssemblies().ToArray());