依赖注入 – ASP.Net Core从另一个控制器调用控制器

前端之家收集整理的这篇文章主要介绍了依赖注入 – 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);
}

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();

然后,您只需通过DI机制将所需的控制器注入其他控制器并调用其操作方法.

猜你在找的.NET Core相关文章