Skip to content

jet/dotnet-templates

Repository files navigation

Jet dotnet new Templates Build Status release NuGet license code size

This repo hosts the source for Jet's dotnet new templates. While that's presently just for Equinox, over time the intention is to add templates for other systems where relevant.

Available Templates

  • eqxweb - Boilerplate for an ASP .NET Core Web App, with an associated storage-independent Domain project.
  • eqxwebcs - Boilerplate for an ASP .NET Core Web App, with an associated storage-independent Domain project ported to C#.
  • eqxprojector - Boilerplate for a CosmosDb ChangeFeedProcessor, with optional projection to Apache Kafka and associated consumer logic.
  • eqxtestbed - Host that allows running back-to-back benchmarks when prototyping models, using different stores and/or store configuration parameters.
  • eqxsync - Boilerplate for a CosmosDb ChangeFeedProcessor that traverses each document in a source store, filtering/enriching/mapping those to Events to be written (consistently) into an Equinox.Cosmos store with optimized throughput.

How to use

As dictated by the design of dotnet's templating mechanism, consumption is ultimately via the .NET Core SDK's dotnet new CLI facility and/or associated facilities in Visual Studio, Rider etc.

To use from the command line, the outline is:

  1. Install a template locally (use dotnet new --list to view your current list)
  2. Use dotnet new to expand the template in a given directory
# install the templates into `dotnet new`s list of available templates so it can be picked up by
# `dotnet new`, Rider, Visual Studio etc.
dotnet new -i Equinox.Templates

# --help shows the options including wiring for storage subsystems,
# -t includes an example Domain, Handler, Service and Controller to test from app to storage subsystem
dotnet new eqxweb -t --help

# if you want to see a C# equivalent:
dotnet new eqxwebcs -t

# see readme.md in the generated code for further instructions regarding the TodoBackend the above -t switch above triggers the inclusion of
start readme.md

# ... to add a Projector and a Consumer
md -p ../tools/My.Tools.Projector | Set-Location
# (-k emits to Kafka and hence implies having a Consumer)
dotnet new eqxprojector -k
start README.md

# ... to add a Testbed
md -p ../tools/My.Tools.Testbed | Set-Location
# -e -c # add EventStore and CosmosDb suppport to got with the default support for MemoryStore
dotnet new eqxtestbed -c -e
start README.md
# run for 1 min with 10000 rps against an in-memory store
dotnet run -p Testbed -- run -d 1 -f 10000 memory
# run for 30 mins with 2000 rps against a local EventStore
dotnet run -p Testbed -- run -f 2000 es
# run for two minutes against CosmosDb (see https://github.com/jet/equinox#quickstart) for provisioning instructions
dotnet run -p Testbed -- run -d 2 cosmos

# ... to add a Sync tool
md -p ../tools/My.Tools.Sync | Set-Location
# (-m includes an example of how to upconvert from similar event-sourced representations in an existing store)
dotnet new eqxsync -m
start Sync/README.md

CONTRIBUTING

Please don't hesitate to create a GitHub issue for any questions so others can benefit from the discussion. For any significant planned changes or additions, please err on the side of reaching out early so we can align expectationss - there's nothing more frustrating than having your hard work not yielding a mutually agreeable result ;)

Contribution guidelines - equinox-* templates

See the Equinox repo's CONTRIBUTING section for general guidelines wrt how contributions are considered specifically wrt Equinox.

The following sorts of things are top of the list for the eqx* templates at the present time:

  • Fixes for typos, adding of info to the readme or comments in the emitted code etc
  • Small-scale cleanup or clarifications of the emitted code
  • support for additional languages in the templates
  • further straightforward starter projects

While there is no rigid or defined limit to what makes sense to add, it should be borne in mind that dotnet new eqx* is often going to be a new user's first interaction with Equinox and/or [asp]dotnetcore. Hence there's a delicate (and intrinsically subjective) balance to be struck between:

  1. simplicity of programming techniques used / beginner friendliness
  2. brevity of the generated code
  3. encouraging good design practices