在我的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); }
How can I use the dependency injection system builtin to ASP.Net 5 to create an instance of the required API controller for me?
在你的Startup.cs中可以告诉MVC注册你所有的controllers as services.
services.AddMvc().AddControllersAsServices();