作为一名长期深耕.NET技术栈的全栈开发者,我最近重构了五年前开发的图书管理系统。这个基于WPF框架的项目不仅完整实现了图书馆业务闭环,更沉淀了我对MVVM模式、Entity Framework Core以及WPF数据绑定的深度实践。今天分享的这套源码特别适合需要快速构建企业级桌面应用的中高级开发者参考。
这个系统最初是为本地社区图书馆设计的,经过多次迭代现已支持:
注意:本系统采用.NET 6 LTS版本开发,需注意与旧版.NET Framework的兼容性差异
系统采用经典的三层架构:
code复制Presentation Layer (WPF)
↓
Business Logic Layer (C# Class Library)
↓
Data Access Layer (Entity Framework Core)
关键设计决策:
| 技术点 | 备选方案 | 最终选择理由 |
|---|---|---|
| ORM框架 | Dapper vs EF Core | EF Core的变更跟踪更适合复杂业务 |
| UI组件库 | MaterialDesign vs HandyControl | HandyControl的中文文档更完善 |
| 图表控件 | LiveCharts vs OxyPlot | LiveCharts的实时更新性能更优 |
csharp复制// 基于LINQ的动态查询构建
public async Task<List<Book>> SearchBooksAsync(SearchCriteria criteria)
{
var query = _context.Books.AsQueryable();
if (!string.IsNullOrEmpty(criteria.ISBN))
query = query.Where(b => b.ISBN.Contains(criteria.ISBN));
if (criteria.CategoryId.HasValue)
query = query.Where(b => b.CategoryId == criteria.CategoryId);
return await query.OrderBy(b => b.Title)
.Skip((criteria.Page - 1) * criteria.PageSize)
.Take(criteria.PageSize)
.ToListAsync();
}
性能优化点:
借阅流程的状态机设计:
mermaid复制stateDiagram
[*] --> Available
Available --> CheckedOut: 借出操作
CheckedOut --> Overdue: 超过归还日期
CheckedOut --> Returned: 正常归还
Overdue --> Returned: 归还(需缴罚金)
Returned --> Available: 重新上架
对应的事件处理代码:
csharp复制public class BorrowService
{
public BorrowResult BorrowBook(int bookId, int userId)
{
var book = _bookRepository.GetById(bookId);
if (book.Status != BookStatus.Available)
return BorrowResult.Failed("图书不可借阅");
var loan = new LoanRecord {
BookId = bookId,
UserId = userId,
BorrowDate = DateTime.Now,
DueDate = DateTime.Now.AddDays(30)
};
_loanRepository.Add(loan);
book.UpdateStatus(BookStatus.CheckedOut);
return BorrowResult.Success(loan.Id);
}
}
双向绑定示例:
xml复制<TextBox Text="{Binding Book.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
集合绑定优化技巧:
图书状态指示灯控件:
csharp复制public class StatusIndicator : Control
{
public static readonly DependencyProperty StatusProperty =
DependencyProperty.Register("Status", typeof(BookStatus), typeof(StatusIndicator));
// 省略样式模板和状态转换逻辑
}
对应的XAML样式:
xml复制<Style TargetType="{x:Type local:StatusIndicator}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:StatusIndicator}">
<Ellipse Fill="{TemplateBinding Status, Converter={StaticResource StatusToBrushConverter}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用WiX Toolset生成MSI安装包:
xml复制<Feature Id="MainApplication" Title="图书管理系统" Level="1">
<ComponentRef Id="MainExecutable" />
<ComponentRef Id="DatabaseComponent" />
</Feature>
EF Core迁移问题:
bash复制# 当模型变更时
dotnet ef migrations add [变更描述]
dotnet ef database update
WPF绑定失效排查:
性能优化记录:
这套系统目前已在三个图书馆稳定运行超过两年,期间最大的收获是认识到良好的架构设计对长期维护的重要性。特别是在处理图书批量导入这种需求变更时,当初采用的分层设计让新增功能变得非常顺畅。源码中我还特意保留了几个典型的重构案例注释,可以帮助理解如何从初级实现逐步优化到生产级代码。