使用Ninject使用Constructor参数实例化新对象

时间:2017-04-23 14:21:44

标签: c# ninject

我正在尝试重构一些代码以将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;
    }
}

我真的不确定如何在绑定类或注入点处理参数

1 个答案:

答案 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个参数是如此易变,以至于它们需要在每次调用时具有不同的值,那么您可能不应该将它们作为构造函数参数传递,而是作为您将调用的某个实例方法的参数运行时的类。