【问题标题】:Injecting Services into a Base Controller class将服务注入基本控制器类
【发布时间】:2012-02-08 00:43:39
【问题描述】:

场景:

使用构造函数注入为给定控制器提供服务的 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 并从子 Controller 类(例如 HomeController)初始化它?

【问题讨论】:

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


    【解决方案1】:

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

    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

    【讨论】:

    • 正确。只是我的语法很差。我在想如果我在我的HomeController 构造函数参数中提到userService,我将不得不在构造函数内部用它做更多的事情。谢谢。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      注入服务(和其他依赖项)的最简单方法是使用 IoC/DI 容器。 ASP.NET MVC 中的一切使它成为可能,这里是对how to make it happen 的解释。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 1970-01-01
        相关资源
        最近更新 更多