业务逻辑-Domain Model
Domain Model是对现实世界中的业务抽象为类,所以类不只包含数据,还包括方法(现实世界的业务逻辑)。但领域模型不包括数据的存取,一般通过仓储模式将(POCO)对象管理数据。
设计一个复杂的系统,应先将现实世界的业务逻辑分割为不同的界限上下文,其实每个界限上下文对应现实世界的一部分独立业务逻辑,将不同的独立业务逻辑拼成一个复杂系统。现实逻辑与程序界限逻辑对应利于代码管理。
仓储模型
这里用Entity Framwork
作为仓储模型,因为Entity Framwork
已经是仓储模型,没有必要再包一层仓储接口。
Entity Framwork
可通过 DbSet<T>
获取保存复杂类型(一个业务类型的属性为一个业务类型,这样为属性的类型对应的数据表存在外键)
案例
这里以一个银行系统为例
- 用户可用开户
- 用户可存入、取出、转账,都需要记日志
代码
代码下载
数据层
新建Domain.Data
类库,通过包安装entity framwork
。
定义类
public class BankAccount
{
public Guid BankAccountId { get; set; }
public decimal Balance { get; set; }
public string CustomerRef { get; set; }
/// <summary>
/// 账户交易记录
/// </summary>
public virtual ICollection<Transaction> Transactions { get; set; }
/// <summary>
/// 是否有足够余额
/// </summary>
/// <param name="amount"></param>
/// <returns></returns>
public bool CanWithdraw(decimal amount)
{
return (Balance >= amount);
}
/// <summary>
/// 取款
/// </summary>
/// <param name="amount"></param>
/// <param name="reference"></param>
public void Withdraw(decimal amount,string reference)
{
if (CanWithdraw(amount))
{
Balance -= amount;
Transactions.Add(new Transaction() { BankAccountId=this.BankAccountId, Withdraw = amount, Reference = reference,Date =DateTime.Now});
}
else
{
throw new Exception("");
}
}
/// <summary>
/// 存款
/// </summary>
/// <param name="amount"></param>
/// <param name="reference"></param>
public void Deposit(decimal amount,string reference)
{
Balance += amount;
Transactions.Add(new Transaction() { Deposit=amount,Reference=reference,Date=DateTime.Now});
}
}
public class Transaction
{
public int ID { get; set; }
// 数据库建表为BankAccount的外键
public Guid BankAccountId { get; set; }
public decimal Deposit { get; set; }
public decimal Withdraw { get; set; }
public string Reference { get; set; }
public DateTime Date { get; set; }
public virtual BankAccount BankAccount { get; set; }
}
数据处理上下文
public class BankAccountContext:DbContext
{
public DbSet<BankAccount> BankAccounts { get; set; }
public DbSet<Transaction> Transactions { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
新建MVC站点引用Domain.Data
程序集
标签:
框架设计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)