实例代码下载
学习SCSF 有写日子了,对该框架有一些了解,于是自己脑子发热写了个假SCSF 虽然不成熟,但是是对自己学习的一个总结。
主要框架示意图(解决方案):
![]()
概念:
1.整个系统共用一个WorkItem(工作单元).
2.WorkItem中有 Service集合.
3.初始默认使用ShellForm.
WorkItem:
WorkItem 是自定义的静态类,在程序启动时加载默认设置,当前是代码以后会使用XML配置。
WorkItem代码:
![]()
WorkItem
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Bob.Library.UI;
using Bob.Library.Services;
![]()
namespace Bob.Library.WorkItems
![]()
![]()
{
public static class WorkItem
![]()
{
private static Shell _ShellForm;
private static IServices _Services;
![]()
public static void InitWorkItem()
![]()
{
InitServices();
InitShellForm();
}
![]()
![]()
public static Shell ShellForm
![]()
{
get
![]()
{
if (_ShellForm == null)
![]()
{
InitShellForm();
}
return _ShellForm;
}
}
![]()
private static void InitShellForm()
![]()
{
_ShellForm = new Shell();
}
![]()
![]()
public static Bob.Library.Services.IServices Services
![]()
{
get
![]()
{
if (_Services == null)
![]()
{
InitServices();
}
return _Services;
}
}
![]()
private static void InitServices()
![]()
{
_Services = new Services.Services();
}
![]()
}
}
![]()
WorkItem 中有一个 IServices 类型的属性 Services,该属性用于保存全局的Service,
IService 有 AddService<TService>、GetServiceByKey<TService>、Clear 三个方法:
实现 添加、获取、清空Service操作。
代码:
![]()
IServices Services
//接口
using System;
using System.Collections.Generic;
using System.Text;
![]()
namespace Bob.Library.Services
![]()
![]()
{
public interface IServices
![]()
{
TService AddService<TService>(string key,TService service) where TService : class;
![]()
TService GetServiceByKey<TService>(string key) where TService : class;
![]()
void Clear();
}
}
![]()
![]()
![]()
//实现
using System;
using System.Collections.Generic;
using System.Text;
![]()
namespace Bob.Library.Services
![]()
![]()
{
public class Services :IServices
![]()
{
IDictionary<string, object> _Services;
![]()
public Services()
![]()
{
InitServices();
}
![]()
private void InitServices()
![]()
{
_Services = new Dictionary<string, object>();
}
![]()
IServices#region IServices
![]()
public TService AddService<TService>(string key, TService service) where TService : class
![]()
{
_Services[key] = service;
return _Services[key] as TService;
}
![]()
public TService GetServiceByKey<TService>(string key) where TService : class
![]()
{
object service = _Services[key];
return service is TService ? service as TService : null;
}
![]()
public void Clear()
![]()
{
InitServices();
}
![]()
#endregion
}
}
![]()
WorkItem 中还有一个 Shell 类型的ShellForm 属性:该属性是一个MDI窗口的实例,作为系统的父容器。
设计图:
![]()
代码:
![]()
Shell
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
![]()
namespace Bob.Library.UI
![]()
![]()
{
public partial class Shell : Form
![]()
{
public Shell()
![]()
{
InitializeComponent();
_AppMenu.Text = AppMenuName;
_ExitMenu.Text = ExitString;
}
![]()
public string FormName
![]()
{
get
![]()
{
return this.ParentForm.Text;
}
set
![]()
{
this.ParentForm.Text = value;
}
}
![]()
public void StatusUpdate(string message)
![]()
{
_ShellStatus.Text = message;
}
![]()
private void _ExitAppMenu_Click(object sender, EventArgs e)
![]()
{
if (MessageBox.Show("Exit ?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
![]()
{
Environment.Exit(0);
}
}
![]()
![]()
![]()
MenuItemString#region MenuItemString
private string _AppName = "Application";
private string _ExitName = "Exit";
public string AppMenuName
![]()
{
![]()
get
{ return _AppName; }
set
![]()
{
_AppName = value;
_AppMenu.Text = _AppName;
}
}
![]()
public string ExitString
![]()
{
![]()
get
{ return _ExitName; }
set
![]()
{
_ExitName = value;
_ExitMenu.Text = _ExitName;
}
}
![]()
#endregion
![]()
public MenuStrip ShellMenu
![]()
{
get
![]()
{
return _ShellMenu;
}
}
![]()
}
}
![]()
Shell 中有 一个菜单控件,一个状态栏控件,将两个控件作为属性发布。
初始加载了一个菜单项 _AppMenu ,将菜单项的Text属性布.
然后为_AppMenu 添加一个子菜单项 _ExitMenu 同时将他的Text属性发布。
为_ExitMenu 添加事件 _ExitAppMenu_Click;
然后发布一个方法 StatusUpdate(string message) 在状态栏显示提示消息。
准备工作完成,开始项目开发:首先创建一个普通的winform项目,将 Bob.Library 应用进来,
在系统开始类 Program.cs 中添加 WorkItem的加载 代码如下:
![]()
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Bob.Library.WorkItems;
using ArchitectureDemo.Services;
![]()
namespace ArchitectureDemo
![]()
![]()
{
static class Program
![]()
{
[STAThread]
static void Main()
![]()
{
Application.EnableVisualStyles();
![]()
Application.SetCompatibleTextRenderingDefault(false);
![]()
InitWorkItem();
![]()
Application.Run(WorkItem.ShellForm);
}
![]()
private static void InitWorkItem()
![]()
{
WorkItem.InitWorkItem();
![]()
AddServices();
![]()
AddModules();
}
![]()
![]()
![]()
private static void AddModules()
![]()
{
WorkItem.ShellForm.AppMenuName = "程序";
![]()
WorkItem.ShellForm.ExitString = "退出";
![]()
AddCustomModule();
}
![]()
private static void AddCustomModule()
![]()
{
ToolStripMenuItem _btnCutomMenuItem = new ToolStripMenuItem("自定义模块");
![]()
ToolStripItem _btnShowMyForm = new ToolStripButton("弹出");
![]()
_btnShowMyForm.Click += new EventHandler(ShowMyForm_Click);
![]()
_btnCutomMenuItem.DropDownItems.Add(_btnShowMyForm);
![]()
WorkItem.ShellForm.ShellMenu.Items.Add(_btnCutomMenuItem);
}
![]()
private static void ShowMyForm_Click(object sender, EventArgs e)
![]()
{
MyForm mForm = new MyForm();
![]()
mForm.MdiParent = WorkItem.ShellForm;
![]()
mForm.Show();
}
![]()
private static void AddServices()
![]()
{
IFormService service = WorkItem.Services.AddService<IFormService>("FormService", new FormService());
}
}
}
![]()
首先: 加载WorkItem 添加InitWorkItem() 方法,将Bob.Library 中的ShellForm 实例化。
然后加载 Service 和 模块
AddServices() 添加一个 Key 为 FormService 的 IFormService 实例,该实例在MyForm中有用到。
![]()
GetService
private void btnGetGUID_Click(object sender, EventArgs e)
![]()
{
IFormService service = WorkItem.Services.GetServiceByKey<IFormService>("FormService");
txtGUID.Text = service.GetGuidString();
}
AddModules() ,模拟的添加一个自定义模块,AddCustomModule(),为该模块添加独享的菜单,为该模块添加子菜单,
为子菜单绑定事件.
然后我们让程序开始Run 我们的 Shell Application.Run(WorkItem.ShellForm);