It's possible to use both the DSL and a code-based library together - perhaps you want to define a basic model via the DSL, and use automatic extraction to add components to the model. To do this, define your workspace using the DSL as normal, for example:
workspace {
model {
s = softwareSystem "Software System" {
webapp = container "Web Application"
database = container "Database" {
webapp -> this "Reads from and writes to"
}
}
}
views {
container s {
include *
autoLayout lr
}
}
}
Since the DSL parser is written in Java, you can use it directly by adding a dependency on the structurizr-dsl
library, which is available on Maven Central:
- groupId:
com.structurizr
- artifactId:
structurizr-dsl
You can then write a Java program that parses your DSL definition, and extends the workspace further; for example:
StructurizrDslParser parser = new StructurizrDslParser();
parser.parse(new File("workspace.dsl"));
Workspace workspace = parser.getWorkspace();
Container webApplication = workspace.getModel().getSoftwareSystemWithName("Software System").getContainerWithName("Web Application");
// add components manually or via automatic extraction
...
// add a component view
ComponentView componentView = workspace.getViews().createComponentView(webApplication, "Components", "Description");
componentView.addDefaultElements();
componentView.enableAutomaticLayout();
Please note that the Structurizr for Java library is designed to be append only, so it's not possible to remove/modify elements/relationships that already exist in the model.
Ports of the "Structurizr for Java" library are available for a number of other programming languages - see https://structurizr.org/#authoring for links. Although you can't use the DSL parser directly, you can achieve the same effect with the following steps:
This can be done using the Structurizr CLI export command:
structurizr export -workspace workspace.dsl -format json
A Structurizr for .NET version of the above example is as follows:
FileInfo fileInfo = new FileInfo("workspace.json");
Workspace workspace = WorkspaceUtils.LoadWorkspaceFromJson(fileInfo);
Container webApplication = workspace.Model.GetSoftwareSystemWithName("Software System").GetContainerWithName("Web Application");
// add components manually or via automatic extraction
...
// add a component view
ComponentView componentView = workspace.Views.CreateComponentView(webApplication, "Components", "Description");
componentView.AddDefaultElements();
componentView.EnableAutomaticLayout();