结合 Identity 登录注册、后台业务、分层解耦、单人易维护设计,区分页面层、业务服务层、数据仓储、模型、公共工具、认证,适配你「注册 / 登录 / 权限 / 后台存数据带操作人」全套需求。
YourProject/
├── Program.cs # 全局DI、认证、BB服务注册入口
├── App.razor # 路由+全局授权拦截
├── appsettings.json 数据库连接串、配置
├── wwwroot/ 静态资源(css/js/图片)
│
├── Data/ 数据库&Identity核心
│ ├── AppDbContext.cs EF上下文(Identity+业务表)
│ ├── Migrations/ EF迁移文件
│
├── Entities/ 全部数据库实体
│ ├── Identity/ 扩展用户实体
│ │ └── AppUser.cs
│ └── Business/ 业务表(商品/订单等)
│ └── Product.cs
│
├── Models/ DTO、表单Model、视图模型
│ ├── Account/ 登录/注册表单模型
│ │ ├── LoginModel.cs
│ │ └── RegisterModel.cs
│ └── Dtos/ 接口传输DTO
│
├── Repositories/ 数据仓储层(解耦EF)
│ ├── IProductRepo.cs
│ └── ProductRepo.cs
│
├── Services/ 业务逻辑层(核心业务)
│ ├── AccountService.cs 登录注册封装(可选,简化页面代码)
│ └── ProductService.cs 商品增删改查业务
│
├── Shared/ 全局共享组件、布局、工具
│ ├── MainLayout.razor 主布局(导航、退出按钮)
│ ├── RedirectToLogin.razor 未登录跳转组件
│ ├── AuthHelper.cs 获取当前登录用户工具类
│ └── Components/ 通用弹窗、表格组件
│
├── Pages/ 所有页面(路由页面)
│ ├── Account/ 账号相关页面
│ │ ├── Login.razor
│ │ └── Register.razor
│ └── Admin/ 后台管理页面(需授权)
│ └── Product.razor 商品管理(保存带创建人)
└── obj / bin 编译缓存(忽略)
分层职责说明(单人开发清晰不混乱)
- Data 数据层(只管数据库)
AppDbContext:包含 Identity 用户表 + 业务实体 DbSet
Migrations:EF 自动生成迁移,不要手动修改
职责:只定义表关系,不写业务逻辑 - Entities 实体层(数据库映射类)
Entities/Identity/AppUser
继承 IdentityUser,扩展昵称、手机号等自定义字段
Entities/Business/Product
业务表,包含 CreateUserName 创建人、创建时间等审计字段
规范:只包含属性,无复杂业务方法(轻量实体,单人不用重型 DDD) - Models 视图传输层(页面表单、返回对象)
Account 文件夹:登录、注册页面绑定的表单类(LoginModel/RegisterModel)
Dtos:列表查询返回、新增编辑专用传输对象,隔离数据库实体,避免泄露敏感字段 - Repositories 仓储层(隔离 EF Core)
接口 + 实现分离,页面 / 服务不直接操作 DbContext
示例:
IProductRepo 定义查询、新增、修改接口
ProductRepo 实现 DbContext 操作
好处:后续换数据库、加缓存只改仓储,页面完全不动 - Services 业务层(所有业务规则放这里,页面轻量化)
AccountService(可选推荐)
封装注册、登录、退出、校验逻辑,页面只调用方法,不写大量 Identity 代码
ProductService
商品新增、编辑、删除、列表查询,自动注入仓储,自动携带当前操作人用户名
页面只调用 _productService.SaveAsync(model, userName),不用重复写赋值逻辑 - Shared 共享公共资源
MainLayout:全局侧边栏、顶部导航、登录 / 退出按钮
RedirectToLogin:授权拦截跳转组件
AuthHelper:静态工具,封装获取登录用户名、UserId、是否登录
Shared/Components:全局复用弹窗、表格、搜索组件 - Pages 页面层(纯 UI,只做交互,不写复杂逻辑)
Pages/Account 公开页面(无需 [Authorize])
Login.razor/ Register.razor:登录注册表单,调用 AccountService
Pages/Admin 后台私有页面(加 @attribute [Authorize])
所有管理页面,仅调用 Service 获取数据,界面使用 BootstrapBlazor 组件(Table/Dialog/FormInput)
页面原则:不写 EF、不写业务判断,只接收数据、弹窗、按钮事件
适配你需求的分层优势(注册 + 登录 + 权限 + 保存带用户名)
登录身份统一在 Shared/AuthHelper 获取,所有后台页面复用,无重复代码
新增数据自动赋值用户名逻辑封装在 Service,每个后台页面不用重复写
Identity 登录注册逻辑封装 AccountService,Login/Register 页面极简
Admin 文件夹全部页面统一授权,结构清晰,一眼区分前台 / 后台
仓储隔离数据库,后期加日志、数据过滤只需改 Repo,页面不动
极简单人优化建议(不用过度分层)
如果你是个人小型项目,不想拆 Repo+Service 两层,可以简化:
简化目录(小型项目专用)
删除 Repositories,Service 直接注入 DbContext,减少文件数量
YourProject/
├── Data/
├── Entities/
├── Models/
├── Services/ // Service直接操作DbContext,跳过仓储
├── Shared/
└── Pages/
适合:后台管理、个人工具、小型业务,开发更快,维护成本低
路由规范约定
账号页:/account/login / /account/register
后台管理统一前缀 /admin/xxx,全部加授权标签
所有页面统一放在 Pages 下,不零散丢根目录
关键文件存放位置对应功能
表格
功能 对应目录文件
用户注册 / 登录页面 Pages/Account
获取当前登录账号 Shared/AuthHelper.cs
用户数据库实体 Entities/Identity/AppUser.cs
数据库上下文 Data/AppDbContext.cs
商品等业务实体 Entities/Business
后台商品管理页面 Pages/Admin
商品增删业务逻辑 Services/ProductService
全局布局、退出按钮 Shared/MainLayout
未登录自动跳转 Shared/RedirectToLogin
评论 (0)