我有这个界面:
public interface IUserProfileService
{
// stuff
}
实施者:
public class UserProfileService : IUserProfileService
{
private readonly string m_userName;
public UserProfileService(string userName)
{
m_userName = userName;
}
}
我需要将这个注入到这样的控制器中:
public class ProfilesController : BaseController
{
private readonly IUserProfileService m_profileService;
public ProfilesController(IUserProfileService profileService)
{
m_profileService = profileService;
}
}
我不知道如何将此接口及其实现注册到Ninject容器中,以便在Ninject进入此服务的实例时传入userName参数。
我是如何实现这一目标的?
答案 0 :(得分:5)
技术ninject的答案是使用像这样的构造函数参数:
Bind<IUserProfileService>().To<UserProfileService>().WithConstructorArgument("userName", "karl");
当然,你需要弄清楚“卡尔”的来源。这真的取决于你的应用程序。也许它是一个网络应用程序,它在HttpContex上?我不知道。如果它变得相当复杂,那么你可能想要编写一个IProvider而不是进行常规绑定。
答案 1 :(得分:3)
另一种方法是使用Create(string userName)
注入工厂并创建依赖项。
public class UserProfileServiceFactory
{
public IUserProfileService Create(string userName)
{
return new UserProfileService(userName);
}
}
似乎必须创建另一个类,但是当UserProfileService
接受其他依赖时,这些好处主要来自。
答案 2 :(得分:3)
诀窍是不在该类中注入用户名。您将此类称为服务,因此它可能会与多个用户交互使用。我看到两个解决方案:
将抽象注入代表当前用户的服务:
public class UserProfileService : IUserProfileService
{
private readonly IPrincipal currentUser;
public UserProfileService(IPrincipal currentUser)
{
this.currentUser = currentUser;
}
void IUserProfileService.SomeOperation()
{
var user = this.currentUser;
// Do some nice stuff with user
}
}
创建特定于您正在使用的技术的实现,例如:
public class AspNetUserProfileService : IUserProfileService
{
public AspNetUserProfileService()
{
}
void IUserProfileService.SomeOperation()
{
var user = this.CurrentUser;
// Do some nice stuff with user
}
private IPrincipal CurrentUser
{
get { return HttpContext.Current.User; }
}
}
如果可以,请选择选项一。