我正在尝试重构一些代码以将IoC与Ninject框架一起使用。到目前为止,我已成功地在没有任何构造函数参数传递的场景中成功注入类。但是,在传递参数方面我遇到了困难。这是下面绑定类中的第三个绑定。
绑定类
public class Bindings : NinjectModule
{
public override void Load()
{
Bind<ILogger>().To<Logger>();
Bind<IPlayerDatadao>().To<PlayerDatadao>();
Bind<IPlayerScores>().To<PlayerScores>();
}
}
logger类有一个无参数构造函数,并且在传输到Ninject时工作正常。
成功
// IoC creation
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
//Log User details
var logger = kernel.Get<ILogger>();
logger.LogVisitorDetails();
但是,我在下面的尝试引发了异常
失败
string priceString = Foo();
string pointsString = Bar();
return kernel.Get<IPlayerScores>(new[] { new ConstructorArgument("pointsString", pointsString), new ConstructorArgument("points", priceString) });
这是带有构造函数的类。
要注入的类
public class PlayerScores : IPlayerScores
{
[Inject]
public string points { get; set; }
[Inject]
public string price { get; set; }
public PlayerScores(string Points, string Price)
{
points = Points;
price = Price;
}
}
我真的不确定如何在绑定类或注入点处理参数
答案 0 :(得分:1)
我真的不确定如何在绑定类或注入点处理参数
绑定。您应该从模型中删除任何Ninject依赖项:
public class PlayerScores : IPlayerScores
{
public PlayerScores(string points, string price)
{
this.Points = points;
this.Price = price;
}
public string Points { get; set; }
public string Price { get; set; }
}
然后配置内核:
Bind<IPlayerScores>()
.To<PlayerScores>()
.WithConstructorArgument("points", "some points")
.WithConstructorArgument("price", "some price");
或使用ToMethod
,它更加重构,因为它避免了带有参数名称的魔术字符串:
Bind<IPlayerScores>()
.ToMethod(ctx => new PlayerScores("some points", "some price"));
这就是说,如果2个参数是如此易变,以至于它们需要在每次调用时具有不同的值,那么您可能不应该将它们作为构造函数参数传递,而是作为您将调用的某个实例方法的参数运行时的类。