好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WinForm 开发框架

WinForm 开发框架

WinForm 开发框架【加载DLL模式】

之前的那个开发框架好几个朋友都用在了项目里面,也给我提出了很宝贵的意见,虽然最近一直没有什么更新,但是针对朋友们提出的建议,我都仔细考虑了一翻,很多的意见我都融入了系统里面,将不足之处修改过来,本来想把报表的事儿给搞定,但是想了几种方案结果都不了了之。曾经有一个朋友说很欣赏我那个读取DLL文件的框架,以前我觉得写得挺乱的,代码也是比较混乱,有时候我自己翻出来居然要想很久才知道那些代码是什么意思,当时之所以舍弃了这套框架,是因为觉得整个项目的Size会越来越大,因为每一个窗体都是一个类库,然后编译为DLL文件,程序去读取并加载这些DLL文件,所以采取了直接写在竹程序里面的方式,详细介绍在这里:

http://www.cnblogs.com/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://www.cnblogs.com/allen0118/

邮箱:allen0717@163.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

 

分类:  C# ,  WinForm

标签:  WinForm ,  开发框架 ,  加载DLL

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于WinForm 开发框架的详细内容...

  阅读:57次