Socotra
Examples

Modular monolith

A DDD-style modular monolith with two business modules, a shared kernel, and a Web API host.


socotra.yaml

socotra.yaml
socotra:
  version: "1.1"
  solution:
    name: "EcommerceApp"
    rootNamespace: "Ecommerce"
    dotnetVersion: "net9.0"
  architecture:
    pattern: "modular-monolith"
    enforceLayerConstraints: true
    allowedDependencies:
      - from: "*.Application"
        to: "*.Domain"
      - from: "*.Infrastructure"
        to: "*.Application"
      - from: "*.Api"
        to: "*.Application"
  modules:
    - name: "Orders"
      layers:
        - name: "Domain"
          type: ClassLib
          templates: ["base-entity", "aggregate-root", "domain-event"]
        - name: "Application"
          type: ClassLib
          references: ["Orders.Domain"]
          templates: ["repository-interface", "command", "query", "result-pattern"]
        - name: "Infrastructure"
          type: ClassLib
          references: ["Orders.Application"]
          packages: ["Microsoft.EntityFrameworkCore.SqlServer:8.0.0"]
          templates: ["ef-context", "di-registration"]
        - name: "Api"
          type: WebApi
          references: ["Orders.Application"]
    - name: "Catalog"
      layers:
        - name: "Domain"
          type: ClassLib
          templates: ["base-entity"]
        - name: "Application"
          type: ClassLib
          references: ["Catalog.Domain"]
        - name: "Api"
          type: WebApi
          references: ["Catalog.Application"]
  shared:
    - name: "SharedKernel"
      type: ClassLib
      templates: ["base-entity", "result-pattern"]
  host:
    name: "EcommerceApp.Api.Host"
    type: WebApi
    references: ["**/*.Api"]

What you get

$ socotra apply --auto-approve

  + Create solution 'EcommerceApp.sln'
  + Add project   'SharedKernel'              (ClassLib)
  + Apply template 'base-entity', 'result-pattern' to SharedKernel
  + Add project   'Orders.Domain'             (ClassLib)
  + Apply template 'base-entity', 'aggregate-root', 'domain-event'
  + Add project   'Orders.Application'        (ClassLib)
  + Add reference Orders.Domain
  + Apply template 'repository-interface', 'command', 'query', 'result-pattern'
  + Add project   'Orders.Infrastructure'     (ClassLib)
  + Add package   EntityFrameworkCore.SqlServer v8.0.0
  + Apply template 'ef-context', 'di-registration'
  + Add project   'Orders.Api'                (WebApi)
  + Add project   'Catalog.Domain'            (ClassLib)
  + Add project   'Catalog.Application'       (ClassLib)
  + Add project   'Catalog.Api'               (WebApi)
  + Add project   'EcommerceApp.Api.Host'     (WebApi)
  + Add reference Orders.Api, Catalog.Api

Apply complete! 16 added, 0 changed, 0 destroyed.
Schema 1.1 · CLI 1.0