2017-04-23 92 views
0

我试图重构一些代码以使用IoC与Ninject框架。到目前为止,我已经成功地在没有任何构造器参数传递的场景中注入类。但是,在传递参数时遇到困难。这是下面绑定类中的第三个绑定。使用Ninject使用构造函数参数实例化一个新对象

绑定

public class Bindings : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ILogger>().To<Logger>(); 
      Bind<IPlayerDatadao>().To<PlayerDatadao>(); 
      Bind<IPlayerScores>().To<PlayerScores>(); 
     } 
    } 

记录器类有一个参数的构造函数,当转移到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; 
    } 
} 

我真的不知道我应该如何处理参数,无论是在绑定类或注射

+2

'PlayerScores'似乎不是一个组件(具有行为的类)。这是一个数据容器。这些类型的对象(DTO的查看模型,消息,实体)不应由DI容器构造。还要注意,即使'PlayerScopes'是一个组件(它的名字并不暗示),它应该[不会被注入运行时数据](https://www.cuttingedge.it/blogs/steven/pivot/entry.php ?ID = 99)。 – Steven

回答

0

点我真的不知道我该如何处理绑定分类或注入点处的参数

在绑定。你应该从你的模型中删除任何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个参数是如此不稳定,他们需要对每次调用不同的值,那么你可能不应该不要将它们作为构造函数参数传递,而应作为参数传递给您在运行时在类上调用的某个实例方法。

+0

我尝试了这两个,但他们最终将该字符串文字“一些点”传递给构造函数,而不是我想传入的动态值。 – Sperick

+2

是的,这是预期的 - 我的答案的重点是构造函数参数在配置内核时应该知道 - 在绑定时间。如果情况并非如此,请在我的答案结尾处看最后一段 - 这是最后一段。 –

相关问题