如何基于使用Ninject的某些处理在运行时注入/创建对象?

时间:2012-03-14 13:34:11

标签: ninject ninject-2

如何根据某些处理在运行时注入和创建对象?

在下面的代码中,主计算器(GridCalculator)(为简洁而剪断)依赖于PricesCalculator。但是,在实际计算PriceCalculator之前,首先需要在主计算器中进行一些处理。 GridPortfolios的{​​{1}}属性将始终只能在运行时知道。我不确定如何在运行时设置此属性的值(我不关心其他两个构造函数参数PricesCalculator& valDatePrices)。

我想使用Ninject来处理这个对象的创建,因为存在已正确连接的依赖项。

我的Ninject设置如下:

edDatePrices我的Ninject模块的方法

Load

EDGridCalculator

public override void Load()
    {

        Bind<IFileReader<IList<Prices>>>().To<PricesReader>().Named("ValDatePrices");
        Bind<IFileReader<IList<Prices>>>().To<PricesReader>().Named("EDDatePrices");
        Bind<IFileReader<IEnumerable<GridRow>>>().ToMethod(GridReader);    
        /* other declarations*/
        Bind<ICalculator<PriceSet>>().To<PricesCalculator>(); // this is probably not correct
        Bind<ICalculator<IList<GridExposure>>>().To<GridCalculator>();

    }

PriceCalculator

public class GridCalculator : ICalculator<IList<GridExposure>>
{
    public ICalculator<PriceSet> PricesCalculator { get; set; }

    // not sure if constructor injection is the way to go
    public GridCalculator(
                      ICalculator<PriceSet> pricesCalculator
                    , IFileReader<IEnumerable<GridRow>> gridReader)
    {


        this.PricesCalculator = pricesCalculator;
        this.GridReader = gridReader;
    }

    public void Calculate()
    {
        var gdResults = GridReader().Read();
        var pivot = new Pivot(gdResults);
        IList<string> keys = pivot.Keys();

        // Need my PricesCalculator object to be constructed 
        // with the "keys" variable and the other dependencies noted in Load()

        // Continue to use "pivot" at later stages of processing.

    }
}

1 个答案:

答案 0 :(得分:0)

HY 这只是设计正确接口的问题,与ninject无关。在这种情况下,您不应该为密钥数据使用构造函数注入。只需更改价格计算器的计算方法即可获取参数。计算器是构造函数注入但是当调用计算器上的计算器传递必要的数据时。

丹尼尔