我想使用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>()
但是如果构造函数参数在编译时无法解析怎么办?如何通过参数?绑定代码应该如何?
编辑了这个问题。
答案 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");
它不会改变绑定的工作方式。