Dotnet Development Stack
2014~2015 年间使用的 C#.net 开发框架
程序结构
使用三层Domain Driven的模式,Visual Studio Solution 中分为 4 个 Project
Project | Usage |
---|---|
MyProject.Core | 核心代码,分层如 BLL, DAL… |
MyProject.Web | Web 层,使用 NancyFX |
MyProject.Task | 系统后台排程, 也可作为命令行运行偶发任务 |
MyProject.Test | 测试代码 |
各个分层与相关工具
Continuous Integration Process
利用 Jenkins 建立在不同服务器之间的自动部署机制。
CN - IIS
: 北京正式站台
TW - IIS
: 台北正式站台
QA - IIS
: 测试站台
Dev - IIS
: 开发RD用站台
Release Candidate (RC)
: RD发布的候选版本,需经过QA验证后,才可以成为GA版本。
General Availability (GA)
: 经过QA验证的RC版本, 由PM核可后,变为GA版本发布到正式站台。
Frontend (react.js)
Backend (C#)
Core 核心代码 - 分层
DAL 层 :
- 使用 Entity Framework : Code First 开发模式
namespace MyProjectMyProject.Core.DAL.Model
{
[Table("acct_role")]
public class AccountRole
{
[Column("acct_role_id")]
public int ID { get; set; }
[Column("name")]
[MaxLength(100)]
[Required]
public string Name { get; set; }
...
- 使用 Repository Pattern 进行实体类单元的 CRUD 处理
namespace MyProject.Core.DAL.Repo.Simple
...
public class RepoAccountUser : GenericRepository<AccountUser>, IRepoAccountUser
{
// 利用继承自 GenericRepository 的方法,
// 即可实现基础的 Add,Update,Delete,GetById, GetList...
// 等 CRUD 操作。
}
- EF Database Migration: .Core.DAL.EFMigrations, 使用 SQL-Script 模式
public CoreDbContextMigrationConfiguration()
{
// Use command: Update-Database -Script -StartUpProjectName "MyProject.Core"
// if need to drop table:
// this.AutomaticMigrationDataLossAllowed = true;
this.AutomaticMigrationsEnabled =
MyProject.Core.Helper.KitConfig.GetIsDevModeAllowEFAutomaticDbMigration();
this.ContextKey = "MyProject.Core.DAL.CoreDbContext";
}
- 初始化数据: 使用 .Core.DAL.DataInitializer
BLL 层
呼叫 DAL 层的 Repository,处理业务逻辑,封装 EF 的 Transaction。
public class SheetService : BaseService, ISheetService
{
...
public void AddCategory(AccountCompany company, SheetCategory cate)
{
// 定义对 DB 操作是 Reading or Writing scope, Transaction 封装在 using 内
using (var scope = new UnitOfWorkScope<CoreDbContext>(UnitOfWorkScopePurpose.Writing))
{
var targetCompany = this.repoAccountCompany.GetByID(company.ID);
SheetCategory cateNew = new SheetCategory(targetCompany, cate.Name);
this.repoSheetCategory.Insert(cateNew);
// Writing 操作要记得 SaveChanges()
scope.SaveChanges();
this.Log.Info("Created new {0}", cateNew);
}
}
}
Model : 各种实体类,主要分为:
- MongoModel: 对应 MongoDB 的 Bson Model Class
- EFModel: 对应 Entity Framework 的 Model Class
- DTO: Data Transfer Objects
其他
Helper : 使用 static method 提供常用的辅助功能
KitConfig : 读取 App.config, Web.config 中的各个设定
KitStr : 处理字符串
KitDate : 处理日期,例如获得每月最后一天,每天凌晨零时零秒
KitXxx… 其他