正在将服务注入基本控制器类
本文关键字:控制器 注入 服务 | 更新日期: 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,并以适合您的方式在那里注入服务。