王 程,周安琳
(1.河北省科学院应用数学研究所,河北 石家庄 050081;2.中国联合网络通信有限公司河北省分公司,河北 石家庄 050011)
传统设计模式下,程序各项目之间的关系是强耦合的。各项目之间类的相互引用和调用都是写在各项目代码之中的。一旦各项目中被实例化的类有改动,就需要去改变操作类的代码,这种强耦合的设计模式带来的编码改变工作量是以几何级的量级增加的[1]。解决这一问题的办法之一就是将被创建类抽象成一个接口。这样只要接口里的方法不改变,被实例化类中方法的实现有改变的话,操作类也不需要做改变了。但是实际上它们之间的耦合性仍然很高,因为被实例化类的实例化操作仍然需要在操作类中使用。这种依赖关系在“分离关注”的思想下是无法忍耐的,于是产生了新的模式,即控制反转或称为依赖注入(IoC,Inversion of Control)[2]。IoC关注服务(或应用程序部件)是如何定义的以及他们应该如何定位他们依赖的其它服务。它将创建对象的任务交给IoC 容器去做,促进应用程序组件或类之间的松散耦合。
笔者运用Autofac组织使用Asp.Net MVC3的多项目应用程序,在对各项目模块间松耦合的前提下,尽可能的达到不影响整个系统性能,对“乳制品安全风险预警系统”进行扩展设计。从而符合乳制品安全风险预警系统的不断增加的需求。
1)乳制品安全风险预警系统是基于B/S架构的网络应用体系。按照Asp.net MVC的体系架构和具体需求将系统分为4层:浏览器层、Web服务器层、业务层、数据层;
2)系统主要针对3类用户:企业用户、监管用户、系统管理员。这三种用户角色分别具有不同的权限,它们通过登录来获取相应权限。企业用户由监管用户来添加,登录系统后在固定时间周期内进行生成数据上报以及查看公告和信誉评价。监管用户由系统管理员来添加,登录系统后进行统计上传数据、处理问题数据、安全预警、生成预测等操作。系统管理员可以进行用户管理、维护系统参数、优化分析模型等操作。
3)系统主要有3个功能模块,分别是上传数据管理模块,预测预警数学模型管理模块,系统维护模块。
1)各省之间的数据是独立不能相互混淆的,这就要求为每个省单独建立数据库,数据库所在服务器甚至都不可能是在同一台服务器;
2)由于原料乳的生产会受到各地季节、气候、饲料质量等的影响,预测预警数学模型在各省的适用情况就可能会存在很大影响。因此对预测预警数学模型的动态管理也必须满足与其他功能模块非常低的耦合度。
根据系统需求,设计要面向当前系统的业务层、数据层、Web服务器层这三层之间的松耦合[3]。在业务层中,也需要将预测预警数学模型管理模块与其他两个功能模块进行松耦合处理。
Autofac是.net世界里现存的几种IoC框架其中之一,也是速度最快的一个,同类的框架还有Ninject、Spring.NET、Windsor、StructureMap、Unity等[4]。
Autofac的主要特性:
(1)组件侵入性为零。组件不需要去引用Autofac;
(2)灵活的模块化系统。通过模块化组织你的程序,应用程序不用纠缠于复杂的XML 配置系统或者是配置参数;
(3)自动装配。可以是用lambda表达式注册你的组件,Autofac会根据需要选择构造函数或者属性注入;
(4)XML配置文件的支持。XML配置文件过度使用时很丑陋,但是在发布的时候通常非常有用;
(5)组件的多服务支持。许多设计师喜欢使用细粒度的接口来控制依赖,Autofac允许一个组件提供多个服务[5]。
根据系统推广的扩展需求,将使用Autofac对XML配置文件的支持和对组件的多服务支持。
根据乳制品安全风险预警系统需求,应实现对各省业务数据的动态管理和预测预警数学模型的动态管理和维护的设计。
由于各省的上传数据管理模块、系统维护模块的功能相同,企业用户、监管用户之间的管理关系和权限也相同,浏览器层的页面展示也大同小异,所以可在程序的入口处利用Autofac的单例模式。各省的用户在访问系统时,Autofac从配置文件获取该省的配置信息(包括数据库连接信息)并生成该省的单例,系统再从IoC容器中获取该实例。如图1所示。
图1 各省业务数据动态管理
这样,以后系统扩展到其他省时,系统管理员只需要在配置文件中新增该省的配置信息、建立该省的数据库并配置好该省的访问路径,该省用户就可以正常使用本系统。整个操作无需程序修改,大大降低了推广的工作量。
预测预警数学模型的动态管理和维护对设计的要求更高,因为目前还不知道各数学模型对各省实际情况的契合度,所以系统必须做到管理员可以根据各省实际情况动态增删各种数学模型。
根据上述需求,引入Autofac的工厂模式(图2)。
图2 预测预警数学模型管理的工厂模式
如图2所示,预测预警的工厂模式实现时,程序需要决定实例化哪一个或几个模型工厂来实现预测预警类。可以利用Autofac读取配置文件来实现各省实际所需数据模型的实例化。当对现有模型的取舍或先后顺序有调整时,只需要修改一下配置文件;当需要添加新的数学模型,只需要复制该模型和其工厂的类库文件到指定路径,然后修改配置文件即可。通过这种方法,完全能够根据各省实际情况灵活的管理其所使用的各种预测预警数学模型。
以下是实现各省业务数据动态管理的伪代码。代码所属文件为Global.asax.cs。
介绍了利用Autofac对Asp.net MVC3的多项目应用程序进行组织优化的方法。通过该方法可以很大限度的降低乳制品安全风险预警系统各项目之间的耦合度,大大降低对乳制品安全风险预警系统推广的设计难度和工作量,提高工作效率。而且借助Autofac的高性能,对程序的性能影响也降到了最低,基本上可以忽略不计。
[1]王宇,王力,李增智,王海,班世敏.面向对象软件框架中的耦合性及其消解策略的研究[J].小型微型计算机系统.2003,24(10):1743-1747.
[2]李必信.面向对象软件耦合的度量和验证[J].东南大学学报(自然科学版).2006,36(3):446-451.
[3]刘博,胡飞,陆伟.使用Visual Studio模板和策略来统一和维护项目的框架结构[J].科学技术与工程.2007,7(13):3133-3135,3144.
[4]许鹏.Autofac介绍[DB/OL].http://www.cnblogs.com/xupng/archive/2011/07/12/2104766.html,2011-07-12.
[5]深潭.Autofac在MVC 3 中的使用[DB/OL].http://www.cnblogs.com/dbasys/archive/2012/07/19/2598691.html,2012-01-19.