Ninject构造函数参数

时间:2011-06-12 16:11:41

标签: dependency-injection ninject

我有这个界面:

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参数。

我是如何实现这一目标的?

3 个答案:

答案 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)

诀窍是在该类中注入用户名。您将此类称为服务,因此它可能会与多个用户交互使用。我看到两个解决方案:

  1. 将抽象注入代表当前用户的服务:

    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
        }
    }
    
  2. 创建特定于您正在使用的技术的实现,例如:

    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; }
        }
    }
    
  3. 如果可以,请选择选项一。