将服务注入基本控制器类

时间:2012-02-08 00:43:40

标签: c# asp.net-mvc-3 dependency-injection controller initialization

情景:

使用构造函数注入为给定控制器提供服务的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)

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

问题(S):

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

3 个答案:

答案 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并以适合自己的方式注入你的服务。