用Ninject注入'this'

时间:2013-03-04 07:37:13

标签: c# ninject

我刚开始使用Ninject,我有一个问题。假设我有一个TaxCalculator类,它包含带有Sale参数的构造函数。然后我有一个带有ITaxCalculator成员的Sale类。 Normaly我会在Sale construcor中创建TaxCalculator实例,将'this'作为参数。

public class Sale
{
    private ITaxCalculator taxCalculator;

    public Sale()
    {
        this.taxCalculator = new TaxCalculator(this);
    }
}

public class TaxCalculator : ITaxCalculator
{
    private Sale sale;
    public TaxCalculator(Sale sale)
    {
        this.sale = sale;
    }
}

是否可以使用Ninject完成此操作?下面的代码显然不起作用。

public class Sale
{
    private ITaxCalculator taxCalculator;

    [Inject]
    public void SetTaxCalculator(ITaxCalculator taxCalculator)
    {
        this.taxCalculator = taxCalculator;
    }
}

....
using (IKernel kernel = new StandardKernel())
        {
            Sale sale = null;

            kernel.Bind<ITaxCalculator>()
                  .To<TaxCalculator>()
                  .WithConstructorArgument("sale", sale);

            sale = kernel.Get<Sale>();
        }

我希望Ninject做的是在调用Sale构造函数之后调用SetTaxCalculator方法。

1 个答案:

答案 0 :(得分:3)

您可以使用属性注入来执行此操作。

但是拥有这样的循环依赖意味着你的设计存在一些缺陷。我强烈建议修复该结构问题,以便只有一个类需要引用另一个类。

e.g。为什么需要税务计算器参考销售?让销售电话计算器并传递所有必需的信息。例如。 CalculateTax(products)