依赖注入 – ASP.Net Core从另一个控制器调用控制器
在我的ASP.Net Core MVC 6解决方案中,我有两套控制器.一组包含具有常规视图的网页.另一组包含API控制器.
为避免重复数据库逻辑,Web控制器正在使用API??控制器.目前我通过将DbContext作为构造函数参数交给它来手动创建所需控制器的实例.这是通过依赖注入赋予Web控制器的DbContext. 但每当我向API控制器添加另一个构造函数参数时,我需要修改使用此API控制器的所有Web控制器. 如何使用内置于ASP.Net 5的依赖注入系统为我创建所需API控制器的实例?然后它会自动填充所需的构造函数参数. 一种解决方案可以是将db逻辑从API控制器移动到单独的层,并从API和Web控制器中调用它.这不会解决我的问题,因为新层仍然需要相同的参数,我不喜欢不必要的布线. 另一种解决方案是让Web控制器通过Web调用访问API,但这只会增加应用程序的复杂性. 今天我这样做: public IActionResult Index() { using (var foobarController = new Areas.Api.Controllers.FoobarController( // All of these has to be in the constructor of this controller so they can be passed on to the ctor of api controller _dbContext,_appEnvironment,_userManager,_roleManager,_emailSender,_smsSender)) { var model = new IndexViewModel(); model.Foo = foobarController.List(new FoobarRequest() { Foo = true,Bar = false }); model.Bar = foobarController.List(new FoobarRequest() { Foo = false,Bar = true }); return View(model); } } 我希望这样的事情: using (var foobarController = CallContextServiceLocator.Locator.ServiceProvider.GetService<Areas.Api.Controllers.FoobarController>()) { var model = new IndexViewModel(); model.Foo = foobarController.List(new FoobarRequest() { Foo = true,Bar = false }); model.Bar = foobarController.List(new FoobarRequest() { Foo = false,Bar = true }); return View(model); }
在你的Startup.cs中可以告诉MVC注册你所有的controllers as services. services.AddMvc().AddControllersAsServices(); 然后,您只需通过DI机制将所需的控制器注入其他控制器并调用其操作方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |