1. 代码逆向工程训练法
// 从现有代码中提炼模式(示例:典型ERP单据界面)
public partial class SalesOrderForm : Form
{
// 步骤1:观察控件命名规范(btnSave/txtCustomer)
// 步骤2:分析数据绑定方式(dataGridView.DataSource = _bindingList)
// 步骤3:跟踪事件处理流程(btnSave_Click -> ValidateInput() -> SaveToDatabase())
private void btnSave_Click(object sender, EventArgs e)
{
if (!ValidateInput()) return;
try
{
var order = new SalesOrder {
Customer = txtCustomer.Text,
Items = dgvItems.DataSource as List<OrderItem>
};
using(var db = new ErpDbContext())
{
db.SalesOrders.Add(order);
db.SaveChanges();
}
MessageBox.Show("保存成功");
}
catch(Exception ex)
{
LogHelper.WriteError(ex);
MessageBox.Show($"保存失败:{ex.Message}");
}
}
}
训练任务:每天抽取1个现有窗体,完成以下动作:
- 绘制类关系图(使用Visual Studio的Architecture工具)
- 标注核心方法调用链
- 记录异常处理模式
2. 控件开发三板斧
// 自定义ERP网格控件(继承DataGridView)
public class ErpDataGrid : DataGridView
{
// 特性1:自动添加行号
protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
{
this.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
base.OnRowPostPaint(e);
}
// 特性2:金额列自动格式化
public void AddAmountColumn(string name, string header)
{
var col = new DataGridViewTextBoxColumn {
Name = name,
HeaderText = header,
DefaultCellStyle = new DataGridViewCellStyle {
Format = "C2",
NullValue = "0.00"
}
};
Columns.Add(col);
}
}
实战步骤:
- 选择一个常用控件(如TextBox)
- 继承创建CustomTextBox(增加自动Trim、输入校验等特性)
- 在测试窗体中验证功能
二、中级阶段能力构建(6-12个月)
1. ERP典型模式训练
// 单据业务处理模板
public abstract class DocumentBase<T> where T : class
{
protected ErpDbContext _db = new ErpDbContext();
// 模板方法模式:定义单据处理流程
public void ProcessDocument(T document)
{
Validate(document);
BeforeSave(document);
Save(document);
AfterSave(document);
}
protected virtual void Validate(T document) { /* 基础校验 */ }
protected virtual void BeforeSave(T document) { /* 钩子方法 */ }
private void Save(T document)
{
_db.Set<T>().Add(document);
_db.SaveChanges();
}
protected virtual void AfterSave(T document) { /* 后续操作 */ }
}
// 具体销售订单处理
public class SalesOrderProcessor : DocumentBase<SalesOrder>
{
protected override void Validate(SalesOrder order)
{
if (order.Items.Count == 0)
throw new InvalidOperationException("订单必须包含明细");
}
protected override void AfterSave(SalesOrder order)
{
// 自动生成出库单
new StockOutService().CreateFromSalesOrder(order);
}
}
2. 数据层优化技巧
// 使用Dapper提升ERP查询性能
public class InventoryRepository
{
private readonly IDbConnection _conn;
public InventoryRepository(string connStr)
{
_conn = new SqlConnection(connStr);
}
public IEnumerable<InventoryItem> GetRealTimeStock(int warehouseId)
{
const string sql = @"
SELECT ItemId, BatchNo, SUM(Qty) AS Total
FROM InventoryTransactions
WHERE WarehouseId = @wid
GROUP BY ItemId, BatchNo";
return _conn.Query<InventoryItem>(sql, new { wid = warehouseId });
}
}
三、高手阶段突破要点(1-2年)
1. WinForm高级技术栈
| 技术方向 | 具体技能点 | ERP应用场景 |
|---|---|---|
| 异步增强 | async/await与BackgroundWorker结合 | 大型报表生成时防止界面卡死 |
| 动态界面 | 反射+XML布局 | 根据不同用户角色加载模块 |
| 插件化架构 | MEF框架应用 | 灵活扩展新功能模块 |
| 打印引擎 | 自定义报表模板 | 出货单/验收单格式定制 |
2. ERP系统性能优化
// 使用MemoryCache优化基础数据加载
public class DepartmentService
{
private static MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
public List<Department> GetAllDepartments()
{
const string cacheKey = "AllDepartments";
if (!_cache.TryGetValue(cacheKey, out List<Department> list))
{
using (var db = new ErpDbContext())
{
list = db.Departments.AsNoTracking().ToList();
_cache.Set(cacheKey, list, TimeSpan.FromMinutes(30));
}
}
return list;
}
}
四、每日训练计划表
pie
title 每日学习时间分配
"阅读项目代码" : 30
"重构小模块" : 25
"新技术实验" : 20
"编写单元测试" : 15
"业务知识学习" : 10
具体执行方案:
- 早晨30分钟:选择1个核心类(如
SalesOrderService),使用流程图工具绘制其方法调用关系 - 午间实战:在现有系统中找一个简单窗体(如基础数据维护),尝试添加新功能(如导入导出)
- 下班前总结:记录当日遇到的3个技术问题及解决方案到个人知识库
五、避坑指南
- 不要过早追求架构:ERP开发应先吃透业务规则,再考虑技术优化
- 警惕过度设计:WinForm项目慎用复杂模式,保持可维护性优先
- 数据安全铁律:
// 永远使用参数化查询
// 错误示范
var sql = $"SELECT * FROM Users WHERE Name='{txtName.Text}'";
// 正确做法
const string sql = "SELECT * FROM Users WHERE Name=@name";
cmd.Parameters.AddWithValue("@name", txtName.Text);
六、学习资源推荐
-
必读书籍:
- 《C#高级编程(第12版)》重点章节:委托/事件、LINQ、异步编程
- 《企业应用架构模式》重点模式:工作单元、仓储模式、领域模型
-
视频教程:
- Pluralsight上的《Advanced WinForm Techniques》
- B站搜索"ERP开发实战"系列(国内讲师更贴近实际项目)
-
工具集:
- LINQPad:快速测试数据查询
- WinForms Inspector:实时分析控件树
关键成长心法:从今天开始,每次修改代码前问自己三个问题:
- 这个改动会影响哪些现有功能?(使用VS的Find All References)
- 能否用更简洁的方式实现?(查看C#语法糖指南)
- 是否需要与业务人员确认需求?(建立需求追踪矩阵)
坚持3个月后,你会发现自己能独立完成模块设计。一年内可达到高级开发水平,但真正的ERP专家需要3年以上的业务与技术双重积累。