使用构造函数注入为给定控制器提供服务的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)初始化它?
答案 0 :(得分:12)
除了基本初始化程序参数之外,用户服务接口必须包含在子控制器的构造函数参数中。像这样:
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
。
答案 1 :(得分:4)
您需要将IUserService
添加为Constructor Parameter
并将其传递给Base实施。如果Ninject Container
配置有效,这应该足够了:
public HomeController(IArticleService articleService, IUserService userService) :
base(userService)
{
}
答案 2 :(得分:0)
注入服务(和其他依赖项)的最简单方法是使用IoC / DI容器。 ASP.NET MVC具有使其成为可能的所有内容,这里是对how to make it happen的解释。
无论如何,即使没有任何DI,你也可以建立自己的小型IControllerActivator并以适合自己的方式注入你的服务。