1

Ninject を使い始めたばかりで、質問があります。Sale パラメーターを持つコンストラクターを持つ TaxCalculator クラスがあるとします。次に、ITaxCalculator メンバーを持つ Sale クラスがあります。通常、「this」をパラメーターとして指定して、Sale コンストラクターで TaxCalculator インスタンスを作成します。

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

これは、プロパティ インジェクションを使用して行うことができます。

しかし、このような循環依存関係があるということは、設計に何らかの欠陥があることを意味します。クラスの 1 つだけが他のクラスへの参照を必要とするように、その構造上の問題を修正することを強くお勧めします。

たとえば、なぜ税計算機に販売への参照が必要なのですか? セールに電卓を呼び出して、必要なすべての情報を渡します。例えばCalculateTax(products)

于 2013-03-04T11:48:02.867 に答える