使用Ninject将User.Identity.Name作为参数传递给Service Constructor

时间:2014-08-15 13:26:32

标签: asp.net inversion-of-control ninject.web.mvc

在控制器构造函数中使用ninject注入一个具体类型,如此。

  public class HomeController : BaseController
    {
        IUserService userService;
        public HomeController(IUserService _userService)
        {
           this.userService = _userService;
        }
}

然后在ninject中注册就像这样。

kernel.Bind<IUserService>().To<UsersService>();

但是我的UsersService有一个构造函数,它接受当前登录用户的用户名。

如何在ninject中注册我的具体类型,以便在构造函数中传递httpcontext ... User.Identity.Name?

1 个答案:

答案 0 :(得分:1)

您可以使用Ninject Factory Extensions - 实际上您要注意的是注入一个在运行时创建IUserService而不是实际IUserService的抽象工厂。

  

请注意,此不是可怕的服务定位器&#34;反模式,因为工厂只会生成IUSerService个实例

public class HomeController : BaseController
{
    IUserServiceFactory userServiceFactory;

    public HomeController(IUserServiceFactory _userServiceFactory)
    {
        this.userServiceFactory= _userServiceFactory;
    }

    public ActionResult SomeAction()
    {
       //whatever code to get your current userID here, and then:
       var userService = _userServiceFactory.Create(userID);
       //now use userService as required.
       var result = userService.DoMagicStuff();
    }
}

然而,只是指出一件事 - 如果这是一项服务,那么对我来说,将当前的userID等作为服务方法的参数听起来更合理,而不是一个不变量实际的服务本身。服务应该尽可能无国籍......

作为一般经验法则,运行时数据不是一个很好的候选者作为服务依赖 - 当然也有例外。