Tengo problemas para ordenar una forma de gestionar las dependencias automáticas resueltas y manuales en mis clases.Resolviendo dependencias automáticas y manuales
Digamos que tengo dos clases para calcular los precios: una calcula cuánto cobraré por el envío y la otra cuánto cobraré por todo el pedido. El segundo usa el primero para sumar el precio de envío al precio total de la orden.
Ambas clases tienen una dependencia a una tercera clase que llamaré ExchangeRate que me da la tasa de cambio que debería usar para el cálculo del precio.
Hasta el momento tenemos esta cadena de dependencia:
OrderCalculator -> ShippingCalculator -> cambiaria
estoy usando Ninject para resolver estas dependencias y esto estaba trabajando hasta ahora. Ahora tengo el requisito de que la tasa devuelta por la clase ExchangeRate variará según un parámetro que se proporcionará en el Constructor (porque el objeto no funcionará sin esto, por lo tanto, para hacer que la dependencia sea explícita se coloca en el constructor) de una entrada de usuario. Debido a eso, ya no puedo resolver mis dependencias automáticamente.
Cada vez que quiero el OrderCalculator o cualquier otra clase que dependa de ExchangeRate no puedo pedirle al contenedor de Ninject que me lo resuelva ya que necesito proporcionar el parámetro en el constructor.
¿Qué sugieres en este caso?
Gracias!
EDIT: Vamos a añadir algo de código
Esta cadena de objetos es consumido por un servicio WCF y estoy usando Ninject como el contenedor 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); }
Veamos si entendí. Mi OrderCalculator/ShippingCalculator debe recibir un objeto (IExchangeRateFactory) que sea capaz de construir la clase ExchangeRate y llamar a GetExchangeRate pasando el parámetro runtime, ¿verdad? En caso afirmativo, entonces el parámetro runTimeValue se convertirá en algo que debería preocupar a OrderCalculator/ShippingCalculator y me gustaría que no lo hiciera. – tucaz
Si * ninguno * de esos debería tratar con el valor del tiempo de ejecución, ¿de dónde provendría? –
Entiendo lo que dices, pero si me gusta eso, entonces algo (runTimeValue) que era solo una dependencia de ExchangeRate también se convertirá en una dependencia de cualquier otra clase que lo use. Estoy buscando una manera de pasar este runTimeValue al DI Container y dejar que se encargue de la creación del objeto. – tucaz