zoukankan      html  css  js  c++  java
  • 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:用 “四色原型” 进行 “聚合设计”的延伸版。

    职责分配

    聚合

    维护内部状态的一致性。换句话说,聚合的职责只限于维护期自身的状态。可以将聚合的职责分为两类:

    1. 修改职责:只能修改聚合本身的状态,关联的其它聚合信息不能修改。
    2. 读取职责:可以读取聚合本身的状态,关联的其它聚合信息也能读取。

    角色

    维护一个聚合实例业务逻辑的一致性。因为有些聚合实例的业务逻辑会依赖很多外部服务:如仓储、领域服务等。常见的场景如下:

    1. 前置条件:修改内部状态时,必须满足的条件。
    2. 唯一性验证:某些状态必须唯一。
    3. 计算逻辑:此处多数采用状态模式或策略模式。

    领域服务

    维护多个聚合实例(跨聚合)业务逻辑的一致性。

    工厂

    维护聚合的创建逻辑。

    仓储

    维护聚合的持久化逻辑。

     引入工作单元后的聚合生命周期

    代码示例

    分析模型

    设计模型

    项目结构

    代码下载

    感谢360云盘提供的空间:http://yunpan.cn/QWqewDLDKY4vk

    作者:Allen Chen无影
    邮箱:allen0717@163.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
     
    分类: C#WinForm
  • 相关阅读:
    遇见Javascript类型数组
    编译Android常用命令
    V4L2驱动视频开发要点
    Windows Phone开发(27):隔离存储A
    Ubuntu10.04下Android开发环境搭建
    V4L2开发要点
    使用 php Header 报错的一个原因
    Windows Phone开发(28):隔离存储B
    用HTML5 Audio API开发游戏音乐
    php备份数据库类分享
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3045479.html
Copyright © 2011-2022 走看看