解决自动和手动的依赖

I'm有麻烦一点点排序的方式在我的班级管理自动解析和人工的依赖。

Let's说,我有两个类来计算价格:一是计算出多少,我将收取运费和其他我是多么会收取整个订单。 第二个使用第一个以航运价格总和为整个订单的价格。

这两个类都依赖于第三类,我会打电话给ExchangeRate,让我汇价我应该使用价格计算。

到目前为止,我们有这个链条的依赖性:

OrderCalculator - > ShippingCalculator - > ExchangeRate

使用I'm Ninject来解决这些依赖关系,这是工作到现在。 现在我来了一个要求,即通过ExchangeRate类返回率将在将在构造函数提供的参数发生变化(因为没有这个对象不需额外的工作,因此使放置在构造函数的依赖显it's)从一个用户输入。 正因为如此,我再也不能自动解决我的依赖关系。

每当我想要的OrderCalculator或任何其它类取决于ExchangeRate我不能要求Ninject容器将其解析到我,因为我需要提供在构造函数中的参数。

什么ü建议在这种情况下?

谢谢!

编辑:让我们添加一些代码

这一连串的对象是通过WCF服务消费和我使用Ninject作为DI容器。

公共类OrderCalculator:IOrderCalculator {私人IExchangeRate _exchangeRate; 公共OrderCalculator(IExchangeRate exchangeRate){_exchangeRate = exchangeRate; }公共十进制CalculateOrderTotal(订购newOrder){VAR总=0米; 的foreach)(VAR的newOrder.Items项){总+ = item.Price * _exchangeRate.GetRate(; }总回报; }}公共类ExchangeRate:IExchangeRate {私人RunTimeClass _runtimeValue; 公共ExchangeRate(RunTimeClass runtimeValue){_runtimeValue = runtimeValue; }公共十进制的getRate(){//根据_runtimeValue返回率,如果(_runtimeValue == 1)返回15.3米; 否则,如果(_runtimeValue == 2)回报9.9米否则返回30米; }} // WCF服务的公共十进制GetTotalForOrder(订单newOrder,RunTimeClass runtimeValue){//我想用一本字典或东西//像这样ObjectFactory.Resolve(runtimeValue)解决IOrderCalculator depedency时通过runtimeValue; IOrderCalculator计算器= ObjectFactory.Resolve(); 返回calculator.CalculateOrderTotal(newOrder); }

--------------解决方案-------------

与往常一样,当你有一个运行时间值部分的依赖,该解决方案是一个抽象工厂。

像这样的东西应该工作:

public interface IExchangeRateFactory
{
ExchangeRate GetExchangeRate(object runTimeValue);
}

现在注入一个IExchangeRateFactory到消费者的代替ExchangeRate并使用GetExchangeRate方法的运行时间值转换为ExchangeRate实例。

很明显,你还需要提供IExchangeRateFactory的实现和配置NInject映射接口,您的实现。

您可能会发现注射厂家代表或供应商是有益的。 两者都是Mark的(+ 1D)的答案几乎impls。

我终于实现了完全不同的东西。

在我打电话的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没有办法做到这一点(只有重新绑定,这是不是我想要的)我改变了我的容器StructureMap。

谢谢你们对您的帮助! 真的很感激!

此举初始化出构造。

更新的基础上的代码:

//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或者是来自何方。

分类:C# 时间:2015-03-14 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.052 (s). 10 q(s)