I´m, имеющий определенную проблему, сортирующую способ управлять автоматическими разрешенными и ручными зависимостями в моих классах.
Let говорит, что у меня есть два класса для вычисления цен: каждый вычисляет, сколько я буду взимать за поставку и другой, сколько я буду взимать за весь порядок. Второе использование первое для подведения итогов стоимости перевозки ко всей цене порядка.
Оба класса имеют зависимость к третьему классу, что я назову ExchangeRate, который дает мне обменный курс, который я должен использовать для калькуляции цен.
До сих пор у нас есть эта цепочка зависимости:
OrderCalculator-> ShippingCalculator-> ExchangeRate
I´m использование Ninject для разрешения этих зависимостей и это работало до сих пор. Теперь у меня есть требование, чтобы уровень, возвращенный классом ExchangeRate, варьировался на параметр, который будет обеспечен в Конструкторе (потому что объект won´t работает без этого, так для создания зависимости явным it´s помещенный в конструктора), прибывающий из ввода данных пользователем. Из-за этого я больше не могу разрешать свои зависимости автоматически.
Каждый раз, когда я хочу к OrderCalculator или любым другим классам, который зависит от ExchangeRate, я не могу попросить, чтобы контейнер Ninject разрешил его мне, так как я должен обеспечить параметр в конструкторе.
Что Вы предлагаете в этом случае?
Спасибо!
Править: Давайте добавим некоторый код
Эта цепочка объектов используется сервисом WCF, и я использую Ninject в качестве контейнера DI.
public class OrderCalculator : IOrderCalculator { private IExchangeRate _exchangeRate; public OrderCalculator(IExchangeRate exchangeRate) { _exchangeRate = exchangeRate; } public decimal CalculateOrderTotal(Order newOrder) { var total = 0m; foreach(var item in newOrder.Items) { total += item.Price * _exchangeRate.GetRate(); } return total; } } public class ExchangeRate : IExchangeRate { private RunTimeClass _runtimeValue; public ExchangeRate(RunTimeClass runtimeValue) { _runtimeValue = runtimeValue; } public decimal GetRate() { //returns the rate according to _runtimeValue if(_runtimeValue == 1) return 15.3m; else if(_runtimeValue == 2) return 9.9m else return 30m; } } //WCF Service public decimal GetTotalForOrder(Order newOrder, RunTimeClass runtimeValue) { //I would like to pass the runtimeValue when resolving the IOrderCalculator depedency using a dictionary or something //Something like this ObjectFactory.Resolve(runtimeValue); IOrderCalculator calculator = ObjectFactory.Resolve(); return calculator.CalculateOrderTotal(newOrder); }