时间:2010-07-26 14:23:05

标签: c# dependency-injection inversion-of-control ninject

5 个答案:

答案 0 :(得分:7)

答案 1 :(得分:1)

您可能会发现注入factory delegatesproviders非常有用。两者都是马克(+ 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是什么或者它来自何处时,有点难以回答。