2012-03-14 2 views
1

Как я могу внедрить и создать объект во время выполнения на основе некоторой обработки?Как мне добавить/создать объект во время выполнения на основе некоторой обработки с помощью Ninject?

В приведенном ниже коде основной калькулятор (GridCalculator) (сокращенный для краткости) имеет зависимость от PricesCalculator. Тем не менее, некоторая обработка должна произойти в основном калькуляторе сначала до создания ValueCalculator. Свойство GridPortfoliosPricesCalculator всегда будет известно и может быть известно только во время выполнения. Я не уверен, как установить значение этого свойства во время выполнения (меня не интересуют другие два аргумента конструктора valDatePrices & edDatePrices).

Я хотел бы использовать Ninject для обработки создания этого объекта, так как есть зависимости, которые были правильно подключены.

установка

Мой Ninject выглядит следующим образом:

Load Метод моего модуля Ninject

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>(); 

    } 

EDGridCalculator

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. 

    } 
} 

Pricecalculator

public class PriceCalculator: ICalculator<PriceSet>{ 
    [Inject] public IList<string> GridPortfolios; 

    PriceSet _priceSet; 

    public PricesCalculator(
      [Named("ValDatePrices")]IFileReader<IList<Prices>> valDatePrices 
      , [Named("EDDatePrices")]IFileReader<IList<Prices>> edDatePrices 
      /* we could do constructor injection */ 
     ) 
    { 
     this.ValDatePricesReader = valDatePrices; 
     this.EDDatePricesReader = edDatePrices; 
     _priceSet = new PriceSet(); 
    } 

    public void Calculate() 
    { // calcs happen here 
      Result = new PriceSet(); 
    } 

} 
+1

Вы считали метод инъекции? – Jeroen

+0

Мой ответ ниже предполагает, что вы можете изменить интерфейс калькулятора цен. Если это не так, я могу дать вам другое решение –

ответ

0

Hy Это только вопрос проектирования правильных интерфейсов и не имеет ничего общего с ninject. В этом случае вы не должны использовать инъекцию конструктора для ваших данных ключей. Просто измените метод расчета калькулятора цен, чтобы принять параметр. Калькулятор должен быть инжектирован конструктором, но при вызове вычисления на калькуляторе цены передаются необходимые данные.

Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^