答案 0 :(得分:7)
答案 1 :(得分:1)
您可能会发现注入factory delegates或providers非常有用。两者都是马克(+ 1d)答案的重要推动力。
答案 2 :(得分:1)
我最终做了一些完全不同的事情。
在我调用ObjectFactory来解析依赖关系之前,我使用runTimeValue创建了一个新的IExchangeRate实例,并告诉IoC / DI容器使用它而不是创建一个新实例。这样就可以保留整个对象链,而且不需要工厂。
//WCF Service
public decimal GetTotalForOrder(Order newOrder, RunTimeClass runtimeValue)
{
IExchangeRate ex = new ExchangeRate(runtimeValue);
IOrderCalculator calculator = ObjectFactory.With<IExchangeRate>(ex).GetInstance();
return calculator.CalculateOrderTotal(newOrder);
}
但是由于Ninject没有办法做到这一点(只有Rebind不是我想要的)我将容器改为StructureMap。
谢谢大家的帮助!真的很感激!
答案 3 :(得分:0)
答案 4 :(得分:0)
根据代码更新:
//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);
}
注意这个方法如何只需要runtimeValue,以便它可以将它传递给其他东西?这种情况正在发生,因为对象构造和运行时职责是混合的。我认为你应该在这个方法的构造函数中要求一个IOrderCalculator。
所以这个方法就变成了:
//WCF Service
public decimal GetTotalForOrder(Order newOrder, IOrderCalculator calculator)
{
return calculator.CalculateOrderTotal(newOrder);
}
现在,在构造IOrderCalculator时,应该将runtimeValue传递给它的构造函数。当我们不知道runtimeValue是什么或者它来自何处时,有点难以回答。