WinForm 开发框架
WinForm 开发框架【加载DLL模式】
之前的那个开发框架好几个朋友都用在了项目里面,也给我提出了很宝贵的意见,虽然最近一直没有什么更新,但是针对朋友们提出的建议,我都仔细考虑了一翻,很多的意见我都融入了系统里面,将不足之处修改过来,本来想把报表的事儿给搞定,但是想了几种方案结果都不了了之。曾经有一个朋友说很欣赏我那个读取DLL文件的框架,以前我觉得写得挺乱的,代码也是比较混乱,有时候我自己翻出来居然要想很久才知道那些代码是什么意思,当时之所以舍弃了这套框架,是因为觉得整个项目的Size会越来越大,因为每一个窗体都是一个类库,然后编译为DLL文件,程序去读取并加载这些DLL文件,所以采取了直接写在竹程序里面的方式,详细介绍在这里:
http://HdhCmsTestcnblogs测试数据/allen0118/archive/2012/05/10/2494112.html
这样一来也有一个问题,主程序的EXE越来越大,我觉得理论上是这样,所以最近忙里偷闲,将原来的那套框架重新整理了一下,主要有以下几个变化:
1.每一个窗体皆为一个类库,实现相应的接口。
2.用户打开窗体的时候不是直接Open窗体,而是加载DLL文件,读取DLL文件里面的信息。
3.每一个窗体所实现的业务仍然在自己的类文件中完成。
在新建的项目里面实现如下业务:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 using CP.Kernel.Base;
6
7 namespace sysUserGroup
8 {
9 [Serializable]
10 public class Plugins : IPugins
11 {
12 private FrmUserGroup f;
13 public void Activate()
14 {
15 f.Activate();
16 }
17 public void Dispose()
18 {
19 f.Close();
20 GC.Collect();
21 GC.SuppressFinalize( this );
22 }
23 public void Hide()
24 {
25 f.Close();
26 }
27
28 public string Name
29 {
30 get { return " 角色资料设定 " ; }
31 }
32
33 public string GUID
34 {
35 get { return " F2080504B6DC4963BC0963FEFA0E1AAD " ; }
36 }
37
38 public string Version
39 {
40 get { return " 1.0.0.0 " ; }
41 }
42
43 public string Manufacturer
44 {
45 get { return " 制造商 " ; }
46 }
47
48 public string Description
49 {
50 get { return " 用于设定角色资料 " ; }
51 }
52
53 public string TCode
54 {
55 get { return " JSZL " ; }
56 }
57
58 public string FrmUrl
59 {
60 get { return " sysUserGroup.dll " ; }
61 }
62 }
63 }
这里入去传入进来的DLL文件:
1 public void LoadDLL( string DllName)
2 {
3 try
4 {
5 if (DllName.Substring(DllName.Length - 4 ).ToUpper() == " .DLL " )
6 {
7 DllName = DllName.Replace( " .dll " , "" );
8 }
9
10 if ( string .IsNullOrEmpty(DllName))
11 return ;
12
13 if (! allenSingleton.DicLoadDll.ContainsKey(DllName))
14 {
15 IPugins objLoadDll;
16 if (allenSingleton.DicPugins.ContainsKey(DllName))
17 {
18 objLoadDll = allenSingleton.DicPugins[DllName];
19 }
20 else
21 {
22 objLoadDll = CPUtility.LoadDll(DllName);
23 }
24
25 if (objLoadDll != null )
26 objLoadDll.Show(dockPanel, DockState.Document);
27
28 allenSingleton.DicLoadDll.Add(DllName, objLoadDll);
29 }
30 else
31 {
32 allenSingleton.DicLoadDll[DllName].Activate();
33 }
34 }
35 catch (Exception ex)
36 {
37 ShowMsg(ex.Message);
38 }
39
40
41 }
42 internal IPugins getDllObject( string DllName)
43 {
44 IPugins objLoadDll = null ;
45
46 if ( string .IsNullOrEmpty(DllName))
47 return null ;
48
49 if (! allenSingleton.DicLoadDll.ContainsKey(DllName))
50 {
51
52 if (allenSingleton.DicPugins.ContainsKey(DllName))
53 {
54 objLoadDll = allenSingleton.DicPugins[DllName];
55 }
56 else
57 {
58 objLoadDll = CPUtility.LoadDll(DllName);
59 }
60
61 allenSingleton.DicLoadDll.Add(strdllname, objLoadDll);
62 }
63 else
64 {
65 objLoadDll = allenSingleton.DicLoadDll[DllName];
66 }
67 return objLoadDll;
68 }
这个框架比起之前的那一套,数据处理方面没有什么变化,仍然采取存储过程实现业务逻辑,程序里面基本上面看不到SQL语句;布局和风格也是沿用以前的做法,仍然是多文档的布局模式,整体效果还是比较大方的,主要的变化就是核心部分,可以说现在的这套程序跟之前的那一套核心内容完全不一样了,在耦合性方面也有一些改善。加载的窗体如下图,都是DLL:
大致的效果:
多文档布局模式预览:
明天开始五一放长假10天,然后自己再接着请了几天假,终于可以好好休息一下了,五一回来打算再好好优化一下,在这里祝大家五一愉快!
DDD:用 “四色原型” 进行 “职责分配”
这篇博客是 DDD:用 “四色原型” 进行 “聚合设计” 的延伸版。
职责分配
聚合
维护 内部 状态的一致性。换句话说,聚合的职责只限于维护期自身的状态。可以将聚合的职责分为两类:
修改职责:只能修改聚合本身的状态,关联的其它聚合信息不能修改。 读取职责:可以读取聚合本身的状态,关联的其它聚合信息也能读取。角色
维护 一个 聚合实例业务逻辑的一致性。因为有些聚合实例的业务逻辑会依赖很多外部服务:如仓储、领域服务等。常见的场景如下:
前置条件:修改内部状态时,必须满足的条件。 唯一性验证:某些状态必须唯一。 计算逻辑:此处多数采用状态模式或策略模式。领域服务
维护 多个 聚合实例(跨聚合)业务逻辑的一致性。
工厂
维护聚合的 创建 逻辑。
仓储
维护聚合的 持久化 逻辑。
引入工作单元后的聚合生命周期
代码示例
分析模型
设计模型
项目结构
代码下载
感谢360云盘提供的空间: http://yunpan.cn/QWqewDLDKY4vk
作者:Allen Chen 无影
出处: http://HdhCmsTestcnblogs测试数据/allen0118/
邮箱:allen0717@163测试数据本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
分类: C# , WinForm
标签: WinForm , 开发框架 , 加载DLL
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息