Разрешение автоматических и ручных зависимостей

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);    
}
5
задан tucaz 28 July 2010 в 15:25
поделиться