Files
zszq-trs/Framework/YLErp.Core/Interest/AccrualContext.cs
T
hjhan b2cbbff9e7 refactor(margin): 删除未接线的保证金死代码预留抽象
- 删除 MarginAccount 整类、IMarginResolver 子树(MarginForm/CashMargin/CreditMargin/GuaranteeMargin)、MarginBalance 只读 struct:全仓零生产实例化,结构上无法适配 CalcMarginInterest 的盘中差分模型。

- 删除仅覆盖上述死代码的 MarginLegTest(不损失活代码覆盖率)。

- 保留被 CalcMarginInterest 实际使用的 MarginCalc/MarginModes 活代码。

- 同步修剪 ARCHITECTURE.md 树图与对账表,清理 AccrualContext.cs 过期注释。
2026-08-14 08:55:37 +08:00

30 lines
1.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace YLErp.Core.Interest;
/// <summary>
/// 计息执行上下文:把"与具体金额/利率无关"的横向参数(年化天数、精度、trace 收集器)
/// 打包成一个<b>只读值对象</b>,避免每个计息方法都重复携带这些参数。
///
/// <para><b>为何 trace 是"成员"而非散落参数</b>:利息纯函数(AccrueSimple / AccrueCompoundInArrears
/// 的核心职责是算账,trace 只是可观测性的旁路。把 trace 作为上下文的成员传入,
/// 调用点只需传一个 ctx,签名更干净;同时 ctx 是只读值对象,不破坏纯函数
/// (无共享可变状态 → 线程安全、可重入、可测)。<b>切勿</b>把 trace 设成类的实例/静态字段,
/// 那会让并发的两笔交易共用同一 trace、并使函数带隐藏状态。</para>
///
/// <para>与 AccrualState(跨日滚动本金状态)/ AccrualPolicyEOD 会计政策)正交:
/// 本上下文只描述"如何算 + 往哪记",不持有任何交易进度。</para>
/// </summary>
public readonly struct AccrualContext
{
/// <summary>年化天数(365 / 360)。</summary>
public int AnnualDays { get; }
/// <summary>舍入精度位数。默认 11(生产融资腿/保证金腿均显式传入 FundingLegPrecision=12)。</summary>
public int Precision { get; }
/// <summary>可选 trace 收集器;为 null 时不记录(纯计算场景直接传 null,与开关无关)。</summary>
public AccrualTrace? Trace { get; }
public AccrualContext(int annualDays, int precision = 11, AccrualTrace? trace = null)
=> (AnnualDays, Precision, Trace) = (annualDays, precision, trace);
}