TimeSeries Walkthrough¶
This page shows how to add TimeSeries endpoints to an existing Domain Services Web API project.
By the end you will have a working /api/timeseries/{connectionId} that reads from a CSV folder, with Swagger showing all available endpoints.
Choosing a Service Class¶
TimeSeries has a hierarchy of service classes. Pick the one that matches your data model:
| Connection class | Service class | Use when… |
|---|---|---|
TimeSeriesServiceConnection |
TimeSeriesService<TId,TValue> |
Basic named time series, read and update |
DiscreteTimeSeriesServiceConnection |
DiscreteTimeSeriesService<TId,TValue> |
Read-only listing of all series (GetAll, Count) |
GroupedDiscreteTimeSeriesServiceConnection |
GroupedDiscreteTimeSeriesService<TId,TValue> |
Series organised into groups/projects |
UpdatableTimeSeriesServiceConnection |
UpdatableTimeSeriesService<TId,TValue> |
Full CRUD on series (add/remove/update) |
GroupedUpdatableTimeSeriesServiceConnection |
GroupedUpdatableTimeSeriesService<TId,TValue> |
Group-aware full CRUD |
Default type parameters are TId = string, TValue = double. Most use cases work with TimeSeriesService<string, double>.
Step 1 — Install the Package¶
dotnet add package DHI.Services.TimeSeries.WebApi
This also brings in DHI.Services.TimeSeries (which includes the built-in CSV provider).
Step 2 — Register the Converters¶
In Program.cs, inside .AddJsonOptions(...):
options.JsonSerializerOptions.AddConverters(
DHI.Services.TimeSeries.WebApi.SerializerOptionsDefault.Options.Converters
);
Warning: Forgetting this step causes
NotSupportedExceptionat runtime when the API tries to serializeTimeSeriesorDataPointobjects.
Step 3 — Add a Connection Entry¶
Option A — Declarative (connections.json)¶
Add an entry in App_Data/connections.json. The CSV provider is built into DHI.Services.TimeSeries:
{
"$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[DHI.Services.IConnection, DHI.Services]], mscorlib",
"ts-csv": {
"$type": "DHI.Services.TimeSeries.WebApi.TimeSeriesServiceConnection, DHI.Services.TimeSeries.WebApi",
"ConnectionString": "[AppData]timeseries",
"RepositoryType": "DHI.Services.TimeSeries.CSV.TimeSeriesRepository, DHI.Services.TimeSeries",
"Name": "TimeSeries (CSV)",
"Id": "ts-csv"
}
}
The ConnectionString points to a folder containing your .csv files. Each .csv file is treated as a named time series (the file name without extension becomes the series ID).
Option B — Imperative (code)¶
ServiceLocator.Register(
new DHI.Services.TimeSeries.TimeSeriesService<string, double>(
new DHI.Services.TimeSeries.CSV.TimeSeriesRepository(
"[AppData]timeseries".Resolve()
)
),
"ts-csv"
);
Step 4 — SignalR Prerequisite¶
TimeSeries Web API controllers require IFilterRepository in DI. Register it in Program.cs:
builder.Services.AddSingleton<IFilterRepository>(
new FilterRepository("[AppData]signalr-filters.json".Resolve())
);
builder.Services.AddSignalR();
The signalr-filters.json file does not need to exist on disk; the registration just satisfies DI.
Step 5 — Add Sample CSV Data¶
Create App_Data/timeseries/ and add a CSV file, for example WaterLevel.csv:
DateTime,Value
2024-01-01T00:00:00Z,1.23
2024-01-01T01:00:00Z,1.45
2024-01-01T02:00:00Z,1.67
2024-01-01T03:00:00Z,1.52
The first column must be parseable as DateTime; the second as double.
Step 6 — Verify in Swagger¶
Start the API and open Swagger. You should see a /api/timeseries/... group. Common calls:
Get all series IDs
GET /api/timeseries/ts-csv
Get all data points for a series
GET /api/timeseries/ts-csv/WaterLevel/values
Get the last data point
GET /api/timeseries/ts-csv/WaterLevel/values/last
Key Data Types¶
| Type | Description |
|---|---|
TimeSeries<TId, TValue> |
The series entity — holds Id, metadata, and column definitions |
TimeSeriesData<TValue> |
A collection of DataPoint<TValue> values for a series |
DataPoint<TValue> |
A single (DateTime Timestamp, TValue Value) pair |
Using Other Providers¶
Swap RepositoryType in connections.json to use a different backend:
| Provider | NuGet package | RepositoryType assembly |
|---|---|---|
| CSV (built-in) | DHI.Services.TimeSeries |
DHI.Services.TimeSeries |
| USGS (live data) | DHI.Services.Provider.USGS |
DHI.Services.Provider.USGS |
| PostgreSQL | DHI.Services.Provider.PostgreSQL |
DHI.Services.Provider.PostgreSQL |
| MIKE DFS files | DHI.Services.MIKECore |
DHI.Services.MIKECore |
See domain_services/references/time_series/ for provider-specific documentation.
Summary¶
- Install
DHI.Services.TimeSeries.WebApito get REST endpoints for time series data. - Register
DHI.Services.TimeSeries.WebApi.SerializerOptionsDefault.Options.ConvertersinProgram.cs. - Add a
TimeSeriesServiceConnectionentry inconnections.jsonand pointConnectionStringat your data folder. - The CSV provider is built-in — no extra package needed for local development.
- Switch providers by changing
RepositoryTypeonly; the service and endpoints stay the same.
Next: Jobs