乐于分享
好东西不私藏

新手必看:3 步搭出不乱的软件骨架(附可直接抄的代码)

新手必看:3 步搭出不乱的软件骨架(附可直接抄的代码)
📌 《从大泥球到四层架构:一个桌面软件的重生》系列第 3 篇 / 共 18 篇。上回书说到:规矩和界面要分房间住。今天给落地指南——3 步,把骨架搭出来,代码可直接抄。
你好,我是极客全栈开发。继续。
这篇是"行动篇"。前面讲了为什么分房间,这篇给你能直接抄的脚手架。照着做,你的项目从第一行起就不会乱。

01

本篇你将获得
  • 搭骨架的 3 个明确步骤(带顺序)
  • 每一步怎么算"做对了"的验证标准
  • 新手最常踩的 3 个错误,提前避开

02

第 1 步:按"房间"建文件夹,别按"技术"建
很多新手建项目,习惯建 Models/、Services/、Helper/——这是按"技术种类"建,最后全混一起。
正确做法:按"房间(层)"建文件夹。
Inventory.App/              ← 界面层(Avalonia)Inventory.Application/      ← 应用层Inventory.Domain/           ← 领域层(老板房间)Inventory.Infrastructure/   ← 基础设施层(EF/SQLite)
✅ 验证标准:打开解决方案,看一眼文件夹,你能立刻说出"规矩在哪、界面在哪"。如果分不清,说明这步没做对。
💡 文件夹名用"层"命名,而不是"实体名"或"技术名"。这是分层的第一道物理边界。

03

第 2 步:把"业务规矩"写进领域层
在 Inventory.Domain 里,写只关心业务、不关心界面的代码。比如库存商品:
// Inventory.Domain/Product.csnamespace Inventory.Domain;public class Product{    public string Code { get; private set; } = "";  // 商品编码,规矩①:必须以 SP- 开头    public string Name { get; private set; } = "";    public int Qty { get; private set; }             // 库存数量    // 所有对状态的修改,都从这里走——规矩只此一家    public Result AdjustQty(int delta)    {        if (Qty + delta < 0) return Result.Fail("库存不足");  // 规矩②:不能为负        Qty += delta;        return Result.Ok();    }}
注意:这里没有任何 using Avalonia、using Microsoft.Data.Sqlite。领域层不认识界面,也不认识数据库。
✅ 验证标准:领域层项目的引用里,找不到任何界面/数据库相关的包。有,就是越界了。

04

第 3 步:界面层只"转发",不"思考"
在 Inventory.App 里,ViewModel 调领域层,但不写规矩:
// Inventory.App/ViewModels/ProductViewModel.cs[RelayCommand]private async Task OutboundAsync(){    var product = await _repo.GetAsync(Id);              // 拿到领域对象    var result = product.AdjustQty(-Qty);               // 规矩在领域层执行    if (result.IsOk) await _repo.SaveAsync(product);    // 存回去    else ShowError(result.Message);                     // 只展示结果}
✅ 验证标准:你的 ViewModel / 按钮事件里,搜不到 if (库存 < 数量) 这类业务判断。有,就退回去改第 2 步。

05

新手最常踩的 3 个错
错误
后果
正确姿势
按技术建文件夹(Models/
规矩和界面又混一起
按层建(Domain/
在 ViewModel 写 if 校验
扫码/按钮各写一份,慢慢不一致
校验只在领域层
领域层引用界面/数据库
换框架全重写
领域层零外部依赖

06

下一篇咱们干啥?
骨架有了。但"领域层"具体放啥,学问大着呢。下一篇聊最烧脑也最值钱的一个决定:商品库存,到底该放一个类里,还是分开? 这个选择,能决定项目生死。

07

思考题
你建新项目时,是"按层建文件夹"还是"按技术建文件夹"?评论区扣 1 或 2,看看大家的习惯。