在控制器构造函数中使用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?
答案 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等作为服务方法的参数听起来更合理,而不是一个不变量实际的服务本身。服务应该尽可能无国籍......
作为一般经验法则,运行时数据不是一个很好的候选者作为服务依赖 - 当然也有例外。