带有Ninject的多个参数的构造函数
本文关键字:参数 构造函数 Ninject 带有 | 更新日期: 2023-09-27 18:20:35
我正在尝试将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>()
但是如果构造函数参数不能在编译时解析怎么办?如何传递参数?绑定代码应该如何
编辑以澄清问题
这很容易。无论有多少构造函数参数,绑定都保持不变:
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
参数的值!
Ninject可以注入多个构造函数参数,如:
Bind<IMyClass>().To<MyClass>().InSingletonScope()
.WithConstructorArgument("customerName", "Daenerys Targeryan")
.WithConstructorArgument("customerAddress", "King's Landing");
它不会改变绑定的工作方式。