背景
the ability to create meaningful diagrams is the pinnacle of communication skills as an engineer。
创建有意义的图表的能力是工程师沟通技巧的顶峰。
C4模型
C4是Simon Brown提出的一种软件架构的可视化模型。
C4 模型是一种易于学习、开发人员友好的软件架构图绘制方法。
良好的软件架构图有助于软件开发/产品团队内部/外部的沟通、新员工的高效入职、架构审查/评估、风险识别(例如风险风暴)、威胁建模等。
简单来说,C4就是软件架构,从背景、部署、系统、代码四个层面逐步放大。
C4模型的实现:C4Sharp
C4Sharp ( C4S ) 是一个基于 C4 模型的 .net 库,用于将图表构建为代码。
它的工作原理类似于 C4-PlantUML 的超集,开发人员可以通过它以代码 (C#) 形式创建、共享和使用 C4 模型图,例如上下文、容器、组件和部署图。
该库生成以下图表类型:PNG、SVG、PUML、MERMAID。
入门
首先,您需要 .NET 5.0+ 和 Java 来运行 C4Sharp。
另外,您应该在项目中安装 C4Sharp 包。
该软件包可通过 Nuget Packages 获得。
要使用 C4S 库构建图表,我们需要通过直接从 DiagramBuildRunner 继承属性的类来识别结构及其关系。请参阅以下构建容器图的示例:
namespace C4Bank.Deposit.Architecture;
public class ContainerDiagram : DiagramBuildRunner
{
protected override string Title => "C4Bank Context of Deposit Area";
protected override DiagramType DiagramType => DiagramType.Container;
protected override IEnumerable<Structure> Structures => new Structure[]
{
new Person("Customer", "Customer", "Bank Customer"),
new SoftwareSystem("OTBank.Finance", "Finance", "OTBank Finance System", Boundary.External),
new SoftwareSystem("C4Bank.Account", "Account", "C4Bank Account System"),
new Api<DepositReceived>("Aspnet/C#", "ACL"),
new EventStreaming<RegisteredAccount>("kafka", "Partition 01"),
SoftwareSystemBoundary.New("Deposit",
new Api<DepositoProcessingWorker>("C#"),
new Database<IDepositRepository>("SQL Server", "Deposit Data Base"),
new ServerConsole<SynchronizeNewAccountConsumer>("C#", "Kafka Consumer"),
new Database<IAccountRepository>("SQL Server", "Account Data Base")
),
};
protected override IEnumerable<Relationship> Relationships => new[]
{
It("Customer") > It("OTBank.Finance") | "send deposit",
It("OTBank.Finance") > It<DepositReceived>() | ("POST", "HTTP"),
It<DepositoProcessingWorker>() < It<DepositReceived>() | ("POST", "HTTP"),
It<DepositoProcessingWorker>() > It<IDepositRepository>(),
It("Customer") > It("C4Bank.Account") | "register",
It("C4Bank.Account") > It<RegisteredAccount>() | "produces",
It<SynchronizeNewAccountConsumer>() > It<RegisteredAccount>() | "consumes",
It<SynchronizeNewAccountConsumer>() > It<IAccountRepository>(),
It<DepositoProcessingWorker>() > It<IAccountRepository>(),
};
}
在项目中编译图表有两种策略:自编译和使用 C4SCLI 工具。
1、自编译方式:
internal static class Program
{
private static void Main()
{
var diagrams = new[]
{
new ContainerDiagram().Build(),
};
new PlantumlSession()
.UseDiagramImageBuilder()
.UseDiagramSvgImageBuilder()
.Export(diagrams);
}
}
2、使用 C4SCLI 工具:
C4SCLI 可用于 DevOps 管道,无需手动编译图表。为此,请安装 C4SCLI 工具并执行以下命令:
$ c4scli build <solution path> [-o <output path>]
可以参阅以下示例
$ mkdir assets
$ c4scli build /src/c4sharp.sln -o /c4
...
C4 diagram PNG files
C4 diagram generated: file:////c4/internet-banking-system-api-application-c4component.png
C4 diagram SVG files
C4 diagram generated: file:////c4/internet-banking-system-api-application-c4component.svg
C4 diagram MD files
C4 diagram generated: file:////c4/internet-banking-system-api-application-c4component.mermaid.md
C4 diagram PUML files
C4 diagram generated: file:////c4/internet-banking-system-api-application-c4component.puml
前面的步骤将产生以下图像:
您可以通过实现 SetStyle() 方法来自定义图表,如下例所示:
protected override IElementStyle? SetStyle()
{
return new ElementStyle()
.UpdateElementStyle(ElementName.Person, "#000000", "#000000")
.UpdateElementStyle(ElementName.Container, "#ffffff", "#000000", "#000000", false, Shape.RoundedBoxShape)
.UpdateElementStyle(ElementName.System, "#f4f4f4", "#000000", "#000000", false, Shape.RoundedBoxShape)
.UpdateElementStyle(ElementName.ExternalSystem, "#f4f4f4", "#000000", "#000000", false, Shape.RoundedBoxShape);
}
现在,C4Sharp可以编译Mermaid markdown文件。为此,您应该使用函数 UseDiagramMermaidBuilder() 。以下代码显示了如何编译这些文件。
context
.UseDiagramImageBuilder()
.UseDiagramSvgImageBuilder()
.UseDiagramMermaidBuilder()
.Export(diagrams);
使用上面的代码,您将得到以下结果: