带有Ninject的多个参数的构造方法

时间:2014-09-04 14:17:15

标签: c# ninject ioc-container

我想使用Ninject作为IoC容器,但无法理解如何在构造函数中创建一个具有多个参数的类的实例。基本上我有一个用于PCL库中的身份验证的服务接口及其在WP8项目中的实现,该项目在构造函数中接收cosumer密钥,secret和baseAddress:

//On PCL project
public interface IAuthorizationService {
 bool Authenticate();
}

//On WP8 Project
pubilc class MyAuthenticator : IAuthorizationService {
 public MyAuthenticator(string consumerKey, string consumerSecret, string baseAddress) { ... }
 public bool Authenticate() { ... }
}

现在我需要配置Ninject模块,以便我可以获得IAuthorizationService的实例。 如果我的班级没有构造函数,我会这样做:

internal class Module : NinjectModule {
 public override void Load() {
  this.Bind<IAuthorizationService>().To<MyAuthenticator>();
 }
}

如果它有构造函数的固定值,我会这样做:

internal class Module : NinjectModule {
 public override void Load() {
  this.Bind<IAuthorizationService>().To<MyAuthenticator>().WithConstructorArgument( */* fixed argument here*/* );
 }
}

获取实例Module.Get<IAuthorizationService>()

但是如果构造函数参数在编译时无法解析怎么办?如何通过参数?绑定代码应该如何?

编辑了这个问题。

2 个答案:

答案 0 :(得分:11)

这很容易。无论有多少构造函数参数,绑定都保持不变:

Bind<IAuthorizationService>().To<MyAuthenticator>();

假设MyAuthenticator有一个构造函数,其中一个参数类型为IFoo。 您所要做的就是告诉ninject如何解析/创建IFoo。同样,非常简单:

Bind<IFoo>().To<Foo>();

除了之外,您不需要WithConstructorArgument,以防您想要覆盖ninject的默认行为。假设MyAuthenticator具有IFoo类型的参数加上您想要专门配置的另一个参数string seed。所有你需要的是:

Bind<IFoo>().To<Foo>();
Bind<IAuthorizationService>().To<MyAuthenticator>()
    .WithConstructorArgument("seed", "initialSeedValue");

无需指定IFoo参数的值!

答案 1 :(得分:1)

Ninject可以注入多个构造函数参数,例如:

 Bind<IMyClass>().To<MyClass>().InSingletonScope()
                .WithConstructorArgument("customerName", "Daenerys Targeryan")
                .WithConstructorArgument("customerAddress", "King's Landing");

它不会改变绑定的工作方式。