正在将服务注入基本控制器类

本文关键字:控制器 注入 服务 | 更新日期: 2023-09-27 18:23:36

场景:

MVC3应用程序,使用构造函数注入为给定控制器提供服务:

public class HomeController : BaseController
{
    private readonly IArticleService _articleService;
    public HomeController(IArticleService articleService)
    {
        _articleService = articleService;
    }
    public ActionResult Index()
    {
        // do stuff with services
        return View()
    }
}

目的:

我有一个UserService,它从Active Directory中获取用户主体数据,我希望这些数据可以从基本控制器的所有控制器中使用。

我尝试将此服务注入我的BaseController,如下所示:

public class BaseController : Controller
{
    private readonly IUserService _userService;
    public BaseController(IUserService userService)
    {
        _userService = userService;
    }
}

就其本身而言,它看起来很好,但现在HomeController中的构造函数关闭了,因为它需要一个: base()初始值设定项。问题是,由于UserService注入,基初始值设定项不是无参数的。

public HomeController(IArticleService articleService) : base(IUserService userService)

上面的代码导致语法错误。

问题:

如何将服务正确地注入到我的BaseController中,并从子控制器类(例如HomeController)初始化它?

正在将服务注入基本控制器类

除了基初始值设定项参数外,用户服务接口还必须包含在子控制器的构造函数参数中。像这样:

public class HomeController : BaseController
{
    private readonly IArticleService _articleService;
    public HomeController(IArticleService articleService, IUserService userService) : base(userService)
    {
        _articleService = articleService;
    }
    public ActionResult Index()
    {
        // do stuff with services
        return View()
    }
}

注意:要从继承的控制器对基本控制器的UserService执行任何操作,请将修改后的访问权限从private更改为protected

您需要将IUserService添加为Constructor Parameter,并将其传递给Base实现。如果Ninject Container配置有效,这应该足够了:

public HomeController(IArticleService articleService, IUserService userService) :
       base(userService)
{
}

注入服务(和其他依赖项)的最简单方法是使用IoC/DI容器。ASP.NET MVC中包含了使其成为可能的一切,以下是如何实现它的解释。

无论如何,即使没有任何DI,您也可以构建自己的小型IControllerActivator,并以适合您的方式在那里注入服务。