我在控制器构造函数中注入了一个具体类型,就像这样。
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等作为服务方法的参数听起来更合理,而不是实际服务本身的不变量。服务应该尽可能是无状态的…
作为一般的经验法则,运行时数据不适合作为服务依赖项——当然也有例外。