带有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>()

但是如果构造函数参数不能在编译时解析怎么办?如何传递参数?绑定代码应该如何

编辑以澄清问题

带有Ninject的多个参数的构造函数

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

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");

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