看着第二个任务,三人一脸的轻松。任务内容如下:
1. 写一个主控制台程序,要求可根据需求随意进行业务组件装配。
2. 要求能够进行正控和反控,即:不只主控台可控制业务组件的行为,业务组件也可对主控台的常用功能进行调用。
姚鑫辰一脸微笑:“总算碰到个简单的任务!”
包打听:“任务是不难,但用处可不一般啊,体现的思想也不简单!”
姚鑫辰:“是啊,我先说说它的好处吧,因组件是可任意装配的,也就是说主控台与业务分离,即主控台不需要引用业务组件,业务组件也不需要引用主控台,这样就把容易变化的业务与相对不易变化的主控台分开了!”
爱找碴:“的确不错,至少改变业务组件时不用重编主控台,且如果是做多层的C/S程序,直接在线加载业务组件就行了,这样只要发布一个主控台就可以不用管客户端版本更新了。”
包打听:“我对第二点有点疑问,正控很好理解,主控台要控制业务组件,比如说要把业务组件加载进主控台,调用业务组件的初始化方法,关闭业务组件时询问等等。那为什么要反控呢?也就是说业务组件为什么要控制主控台呢?”
姚鑫辰:“这个我来解释吧,首先主控台也有一些固有的功能,比如说加载业务组件,控制显示共用的状态栏信息等,有时业务组件需要加载另一个业务组件,或者显示一些自定义的状态信息等等,而这些功能是主控台的行为,业务组件本身并没有,所以需要反控主控台啊!”
包打听:“明白了,那具体要怎么做呢?”
姚鑫辰:“嗯,这个任务可以细分为几个步骤。首先,要定义一个业务组件的配置信息,控制台根据这个业务配置自动生成业务菜单或工具栏。”
包打听:“没错,要生成菜单或工具栏自然不能少了名称,图标等信息,但只生成也没有用啊,触发事件后怎么加载业务组件啊?对了,还发现一个问题,主控台是不知道(不引用)业务组件的,那加载不是更麻烦?”
姚鑫辰:“问到点子上了,因为主控台不引用业务组件,所以必须通过反射加载,而要通过反射加载对象,必须知道组件的文件名和类名,所以上面的配置信息还要有文件名和类名!”
爱找碴:“知道了也没什么用吧,反射返回的类型是object,主控台是不知道业务组件是什么类型的,怎么调用业务组件的方法,如何初始化?”
姚鑫辰:“这个好办,我们可以用接口来实现,规定业务组件必须实现所定义的接口,然后把反射建立的object转换为指定的接口就可以调用方法了。”
包打听:“明白了,我先整理整理,你看对不对?”
姚鑫辰:“好!”
包打听:“首先定义一个业务配置信息,可以用XML定义在客户端,也可以定义在数据库中,这个我们今天不讨论,就以XML来演示吧。我们定义的业务配置信息大致是这样的:
<Root>
<Biz>
<Name>业务名称</Name>
<Text>显示名称</Text>
<Img>图标名称</Img>
<Dll>文件名<Dll>
<Cls>类名</Cls>
</Biz>
…
</Root>”
姚鑫辰:“没错!”
包打听:“然后定义一个通过的接口,主要包括组件初始化的方法,检测组件是否可关闭等:
public interface IBiz
{
bool Init();
bool CanClose();
…
}”
顿了顿,包打听接着说道:“当点击根据配置生成的菜单或工具栏后,主控台则通过反射建立业务对象实例:
Assembly assembly = this.LoadAssembly(fileName);
object obj = assembly.CreateInstance(className, true);
然后把obj强制转换为上面定义的接口IBiz,就可调用业务组件初始化方法了。”
爱找碴:“说得是没错,不过好像漏了业务组件反控主控台了吧,业务组件也没有引用主控台,怎么调用主控台的方法呢?”
姚鑫辰:“这个问题我来回答吧,其实这个问题和正控的本质一样,也得通过接口来实现回调,先要定义一个回调接口,主要包括加载业务组件,设置状态栏信息等方法:
public interface ICallBack
{
bool CreateBiz(string Name);
void SetStatus(string Text);
…
}
然后由主控台实现这个接口,并改变IBiz的Init()方法为Init(ICallBack callback);这样就把回调接口传给了业务组件,业务组件就可以根据ICallBack接口回调主控台的功能了。”
爱找碴:“说完了吧?”
姚鑫辰:“说完了啊!”
爱找碴:“说完了为什么不提供完整的源码给大家下载呢?”
姚鑫辰:“这个问题是这样的,现在不是热身嘛,等过两章开始真正写B/S,C/S两用平台的时候,所有的源码都有了。”
Ps:所谓大道三千,我走一条,在这个系列中我只是想把我走的经验和想法和大家分享,但因作者水平有限,且每个人走的路有所不同,可能会各不相同,有什么问题请畅所欲言,什么批评都可以,说我是菜鸟在这丢人都行,但请不要骂人,否则一律删除!另:为防止个别人捣乱,现已关闭匿名评论,不便之处,敬请谅解!
作者: 一万光年外 欢迎交流