IoC在实际项目中的应用
这篇文章是去年年底做剩余油项目时写的。事逢最近在整理决策系统的框架,该系统要求支持插件式管理,需要在服务的扩展部分采用IoC技术。于是想把IoC技术的部分在以往项目中的应用整理出来。这是第一篇,先帖出来吧。
剩余油预测方法的动态添加
用例分析
来看一下小层剩余油研究用例模型。
小层剩余油研究由三个部分组成:
1. 预测小层剩余油
2. 查看预测结果
3. 人机联作
在这一部分,我们将注意力集中在预测小层剩余油这个环节。试图从预测的多个方法中寻找到设计*通的部分,然后将其提炼出来,形成小层剩余油研究的骨架结构。看一下目前使用的四种预测方法的用例规约,在其中随机抽取出两个用例进行简单的实现。以A.3多层次模糊综合评判为例:
用例名称:A.3多层次模糊综合评判
主执行者
油田开发人员
范围
小层剩余油研究
层次
用户目标级
状态
草稿
前置条件
登录系统
触发条件
要求系统进行多层次模糊综合评判
主成功事件流
1、 系统要求用户提供小层数据和井位数据、多层次模糊综合评判参数
2、 用户提供小层数据和井位数据、多层次模糊综合评判参数
3、 系统进行多层次模糊综合评判,返回并保存多层次模糊综合评判小层预测结果:
后置条件
产生小层预测结果
在多层次模糊综合评判的用例规约中,我们将领域模型的部分直接通过PowerDesigner绘制出来,而非采用常规的CRC卡片的形式。在用例规约的书写上是存在一定问题的,因为在需求整理的过程中,我们需要关注的是应该做什么,而不是怎么做这个问题。那为什么还会采用PowerDesigner呢?这样做的原因是因为剩余油研究项目中领域模型的数量较多,很多时候会造成开发者的混淆,以制品的方式记录下来,更适于查询和归类。在此需要说明的是,虽然记录在PowerDesigner,但记录的仍然是需求,而非设计方案。
我们对该用例进行简单的分析和设计:
[健壮性分析]
[时序图]
[协作图]
我们把分析类整理一下.
领域模型就不写了,参见用例文本中的领域模型
按照同样的方式,对神经网络用例进行简单的分析设计。我们可以得到这样的类图:
观察小层剩余油预测,我们会在这些方法中寻找到共同的部分,即所有的预测方法皆是对小层数据和井位坐标进行预测,所不同的是他们的参数。在这种情况下,我们对小层剩余油研究部分进行简单的抽取.
让我们来看一下非功能性需求:(参见《水驱油田单砂体剩余油研究平台补充规约》)
软件重用性高。建立一套通用化数据访问服务程序类库,窗体对象控制程序类库,图形绘制程序类库。使剩余油后续软件开发难度大大降低。要求各单元之间松散耦合,注重软件和业务的扩展。
很显然,在这种情况下,IoC是最为恰当的解决方案。
那么好吧,让我们来看一下什么是IoC?
关于IoC
IoC的全称叫做Inversion of Control。意思就是翻转控制。怎么解释呢,就是如果你需要我,请你不要调用我,让我来调用你。
让我们以剩余油这个项目为例。所有的预测方法都会以小层数据和井位坐标为基础数据,然后以不同的参数,以不同的逻辑进行计算。目前最为常用的是四种预测方法,但随着技术的不断提高和时间的推移,新的预测方法会不断的涌现。在这种情况下,我们完全可以将这种共通的部分抽象出来,形成接口:
小层预测结果 计算(小层数据,井位坐标,参数)
}
所有的预测方法在加入系统时,都将会实现该接口。根据里氏柯夫代换原则和依赖倒置原则。系统只针对小层剩余油预测接口,而不需要针对具体的预测方法。就像这样:
小层剩余油预测 预测对象=new 神经网络预测();
预测对象.计算(小层数据,井位坐标,神经网络预测);
但是这具有一个问题,就是怎么new神经网络预测()呢,要知道,在此之前你不知道会有什么新的方法,包括它的名称。
红色的部分代表已实现的部分,当新的方法加入时,我们只需要让新的方法实现小层剩余油预测的接口。但是从组件的角度看来,新方法的实现必须表现出对小层剩余油预测部分的调用。在这种情况下,组件间的耦合并非是松散的。
看看Castle是怎么实现的吧。
注意红色部分的标记,新的方法加入时,我们只需要将其描述在配置文件中就可以了。这样当程序运行时,系统会根据配置文件的描述将预测方法对象加载到容器中。当需要时,系统将会从容器上获取新加入的方法,达到反调用的目的。
因此,我们称其为翻转控制,即你不要调用我,我会调用你。
实现Demo
好吧,让我们通过一个Demo来看看小层剩余油在Castle上的应用。
[初步探究]
根据上文的分析,将小层剩余油变化的部分和不变的部分分别提取出来,在IoCDemo.Core项目中建立ISingleLayer和IParameter接口。
/**//// <summary>
/// 小层剩余油研究接口
/// </summary>
public interface ISingleLayer
{
/**//// <summary>
/// 小层剩余油计算
/// </summary>
/// <param name="oilLayerList">小层数据</param>
/// <param name="wellBoreList">井位坐标</param>
/// <param name="param">参数接口</param>
/// <returns>小层剩余油预测结果</returns>
IList Execute(OilLayerList oilLayerList, WellBoreList wellBoreList,IParameter param);
}
/**//// <summary>
/// 小层剩余油的参数接口
/// </summary>
public interface IParameter{}
/**//// <summary>
/// 多层次模糊综合评判参数
/// </summary>
public class MutilayMistParameter:IParameter
{
//多层次模糊综合评判的参数实现
}
/**//// <summary>
/// 多层次模糊综合评判。
/// </summary>
public class MutilayMist:ISingleLayer
{
public IList Execute(OilLayerList oilLayerList,WellBoreList wellBoreList,IParameter param){
MutilayMistParameter parameter=param as MutilayMistParameter;
//多层次模糊综合评判的预测逻辑
return null;
}
}
在此大家应该按照业务逻辑实现相应的业务规则代码。如只是测试目的,可以直接添加示例中的IoCDemo.SingleLayer项目。这些内容完成之后让我们看看如何通过Castle完成业务逻辑的IoC。添加一个IoCDemo.TestFixture项目。
/**//// <summary>
/// IoCDemo的测试类
/// </summary>
[TestFixture]
public class IoCFixture
{
[Test]
public void NormalTest(){
OilLayerList oilLayerList=new OilLayerList();
oilLayerList.Add(new OilLayer(0.5f,"a"));
oilLayerList.Add(new OilLayer(1.5f,"b"));
WellBoreList wellBoreList=new WellBoreList();
wellBoreList.Add(new WellBore(1.2f,1.3f));
wellBoreList.Add(new WellBore(1.1f,1.5f));
Castle.Windsor.IWindsorContainer container=new Castle.Windsor.WindsorContainer();
container.AddComponent("ISingleLayer",typeof(IoCDemo.Core.ISingleLayer),typeof(IoCDemo.SingleLayer.MutilayMist));
container.AddComponent("IParameter",typeof(IoCDemo.Core.IParameter),typeof(IoCDemo.SingleLayer.MutilayMistParameter));
ISingleLayer singleLayerService=container["ISingleLayer"] as ISingleLayer;
IList list=singleLayerService.Execute(oilLayerList,wellBoreList,container["IParameter"] as IParameter);
System.Collections.IEnumerator enumerator=list.GetEnumerator();
while(enumerator.MoveNext()){
Assert.IsNotNull((enumerator.Current as ResultOfOilLayer).Result);
}
}
}
目前Demo中,多层次模糊综合评判参数中的值是在构造函数中完成的。在实际的代码中,我们则可以通过构造函数读取XML文档,这样属性值的设定将更加灵活。
在整体中的应用
1>系统加载时,读取Castle的配置文件,将组件装载到容器内
2>用户选择某一小层时.
系统将会根据用户的选择自动在容器中寻找并创建以用于小层剩余油预测的方法对象,将其显示在方法列表中。
属性将会随着方法对象的创建而创建,通过Parameter属性显示在方法标识的下方,允许用户编辑更改。
用户要求运行多层次模糊综合评判。系统就会调用这段代码
ISingleLayer singleLayerService=container["多层次模糊综合评判"] as ISingleLayer;
IList list=singleLayerService.Execute(oilLayerList,wellBoreList);
转载于:https://www.cnblogs.com/Iverson-Anders/archive/2006/07/29/462661.html