У меня возникли небольшие проблемы с сортировкой способа управления автоматически разрешаемыми и ручными зависимостями в моих классах.
Допустим, у меня есть два класса для расчета цен: один рассчитывает, сколько я будуплата за доставку и другое, сколько я буду взимать за весь заказ.Второй использует первый для суммирования цены доставки со всей ценой заказа.
Оба класса имеют зависимость от третьего класса, который я назову ExchangeRate, который дает мне курс обмена, который я должен использовать для расчета цены,
Пока у нас есть эта цепочка зависимостей:
OrderCalculator -> ShippingCalculator -> ExchangeRate
Я использую Ninject для разрешения этих зависимостей, и это работало до сих пор.Теперь у меня есть требование, чтобы скорость, возвращаемая классом ExchangeRate, изменялась в зависимости от параметра, который будет предоставлен в Конструкторе (поскольку объект не будет работать без этого, поэтому, чтобы сделать зависимость явной, он будет помещен в конструктор).из пользовательского ввода.Из-за этого я больше не могу автоматически разрешать свои зависимости.
Всякий раз, когда я хочу использовать 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);
}