1

我刚开始使用 Ninject,我有一个问题。假设我有一个 TaxCalculator 类,该类具有带有 Sale 参数的构造函数。然后我有 ITaxCalculator 成员的销售类。Normaly 我会在 Sale 构造器中创建 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 方法。

4

1 回答 1

3

您可以使用属性注入来做到这一点。

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

例如,为什么税收计算器需要参考销售?让销售呼叫计算器并传递所有必需的信息。例如CalculateTax(products)

于 2013-03-04T11:48:02.867 回答