将User.Identity.Name作为参数传递给带有Ninject的服务构造函数



我在控制器构造函数中注入了一个具体类型,就像这样。

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

然后在ject中我像这样注册。

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

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

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

你可以使用Ninject Factory Extensions -你所做的就是注入一个抽象工厂,在运行时创建IUserService而不是实际的IUserService

注意这个不是可怕的"服务定位器"反模式,因为工厂只会产生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等作为服务方法的参数听起来更合理,而不是实际服务本身的不变量。服务应该尽可能是无状态的…

作为一般的经验法则,运行时数据不适合作为服务依赖项——当然也有例外。

最新更新