Cross-cutting features and infrastructure — template matrix (expanded)
This document is a static snapshot derived from Directory.Build.props, ConnectSoft.TemplateRepositoryDirectory.Build.props, build/*.props, solution (.slnx) layout, and ConnectSoft.BaseTemplate.ApplicationModel.csproj as of the date in the front matter. Submodule SHAs may differ on other machines.
How to read this document
- § Column legend — repository / evaluation-path identifiers (BT, MS, Bot, Id-H, …).
- § Solution structure — how Layer 2 (
ConnectSoft.BaseTemplate) and Layer 3 (extended) solutions map project types to features.
- § MSBuild feature matrix — one row per flag or small group; Y / N after the full props chain (Host vs
base-template/ satellite where it differs).
- § Repository infrastructure — Docker, Kubernetes manifests, MkDocs, root documentation pipeline (not the same as MSBuild flags).
- § Microsoft Bot Framework (exclusive) — only
ConnectSoft.MicrosoftBotFrameworkTemplate.
- § Testing — test project types present in each solution.
- § ApplicationModel — typically always-on libraries — NuGet/packages wired without
Condition in BaseTemplate’s ApplicationModel (they still need a successful compile of that project).
- § Source files — which
build/*.props to edit when regenerating this matrix.
Legend
| Symbol |
Meaning |
| Y |
Effective true / feature on for that column after imports. |
| N |
Effective false / symbols stripped / feature off for compile graph. |
| — |
Not applicable (e.g. Bot-only row for non-Bot columns — use § Microsoft Bot Framework). |
Column IDs (same as v1 of this matrix)
| ID |
Repository / path |
| BT |
ConnectSoft.BaseTemplate — standalone; full AuthoringMode; no Layer 3 post-import. |
| MS |
ConnectSoft.MicroserviceTemplate — no ConnectSoftBaseTemplateDirectoryPostImport → full Authoring. |
| Bot |
ConnectSoft.MicrosoftBotFrameworkTemplate — MinimalHostNoOp.props (empty) → full Authoring + Bot-only packages (§ Bot). |
| Id-H / Id-S |
ConnectSoft.IdentityTemplate — Host (not under base-template/) vs base-template/ satellite. |
| GW-H / GW-S |
ConnectSoft.ApiGatewayTemplate — Host vs satellite. |
| Wr |
ConnectSoft.WorkerTemplate — Host and satellite share the same Worker minimal overrides (satellite runs ExtendedHost first). |
| HC-H / HC-S |
ConnectSoft.HealthChecksAggregatorTemplate — Host vs satellite (HealthChecksSatelliteOrleansOff on satellite). |
| AS-H / AS-S |
ConnectSoft.AuthorizationServerTemplate — Host vs satellite. |
Host vs satellite (reminder)
- Host — Layer 3 projects at repo root; imports the repo-specific
*Host.props (or Worker minimal) fragment.
- Sat — Projects under
base-template/; usually imports ExtendedHost.BaseTemplateSatelliteDefaults.props so CPM PackageVersion conditions match satellite graphs; ConnectSoft.BaseTemplate satellite *.csproj use Option A (PackageReference Condition aligned with PackageVersion). Extra fragments possible (e.g. Orleans off for Health Checks satellite).
Solution structure and feature correspondence
Layer 2 — ConnectSoft.BaseTemplate (from ConnectSoft.BaseTemplate.slnx)
The template solution is conditional (#if in .slnx): shipped dotnet new output depends on chosen symbols. In AuthoringMode (developer clone of the repo), essentially all optional projects are present.
| Area |
Typical projects |
Driven by (examples) |
| Host entry |
ConnectSoft.BaseTemplate.Application |
Always |
| Composition root |
ConnectSoft.BaseTemplate.ApplicationModel |
Always; pulls most cross-cutting NuGet |
| Domain |
DomainModel, DomainModel.Impl |
Always |
| Persistence |
EntityModel, PersistenceModel, PersistenceModel.NHibernate, PersistenceModel.MongoDb, migrations projects |
PersistenceModelTypeNone, UseNHibernate, UseMongoDb, Migrations |
| Messaging |
MessagingModel, FlowModel, FlowModel.NServiceBus, FlowModel.MassTransit |
MessagingModelTypeNone, UseNServiceBus, UseMassTransit |
| Schedulers |
SchedulerModel, SchedulerModel.Hangfire |
SchedulerModelTypeNone, UseHangFire |
| Service surfaces |
ServiceModel, ServiceModel.RestApi, ServiceModel.Grpc, ServiceModel.GraphQL, ServiceModel.CoreWCF, ServiceModel.SignalR, ServiceModel.AzureFunction, ServiceModel.ServiceFabric |
ServiceModelTypeNone, UseRestApi, UseGrpc, … |
| Actors |
ActorModel, ActorModel.Orleans, ActorModel.Dapr, ActorModel.Akka |
ActorModelTypeNone, UseOrleans, UseDapr, UseAkka |
| AI / agents |
AIModel, AgentFramework, ModelContextProtocol |
UseMicrosoftExtensionsAI, UseMicrosoftAgentFramework, UseMCP, … |
| Cross-cutting |
Options, Metrics, InfrastructureModel |
Options/Metrics typically always; infrastructure pattern varies |
| Tooling |
DiagramAsCodeModel (.pyproj, non-build) |
Always in solution folder |
| Containers |
DockerCompose .dcproj |
Docker |
| Tests |
UnitTests, ArchitectureTests, AcceptanceTests |
Always in Authoring solution |
| Docs |
docs/**, mkdocs.yml, azure-pipelines-documentation.yml |
Repo / template metadata |
Layer 3 — extended templates (Identity, ApiGateway, Worker, …)
| Pattern |
Description |
| Submodule |
base-template/ → same structural ideas as Layer 2; satellite build uses ExtendedHost (see v1 Source files table). |
| Renamed projects |
ConnectSoft.<Product>.* mirrors BaseTemplate slices (e.g. IdentityTemplate.Application replaces or wraps the default BaseTemplate application depending on template). |
| MSBuild profile |
Root Directory.Build.props imports ConnectSoft.TemplateRepositoryDirectory.Build.props → sets post-import that turns off subsets of AuthoringMode for Host only (or Worker minimal for both paths). |
| Solution file |
Root ConnectSoft.*Template.slnx usually includes subset of base-template projects (often ApplicationModel + core) plus all Layer 3 projects; full BaseTemplate test projects may still live under base-template/tests in the submodule. |
MSBuild feature matrix (split rows)
Values: Y = on, N = off. Rows reflect Directory.Build.props AuthoringMode plus Layer 3 build/*.props overrides.
HTTP API surface, documentation UX, transport polish
| Feature (MSBuild / symbol) |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
Swagger (Swagger) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Scalar (Scalar) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
CORS (CORS) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Rate limiting (RateLimiting) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Request timeout (RequestTimeout) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Response compression (Compression) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Health
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
ASP.NET health checks (HealthCheck) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Health Checks UI (HealthCheckUI) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Health UI: in-memory storage (UseInMemoryHealthCheckUIStorageProvider) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Health UI: SQL Server storage (UseSqlServerHealthCheckUIStorageProvider) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Publish to Seq (UseSeqAsHealthChecksPublisher) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Publish to Application Insights (UseApplicationInsightsAsHealthChecksPublisher) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Logging
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
Serilog (Serilog) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Log4Net (Log4Net) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Observability backends and exporters (MSBuild switches)
These flags drive package references and configuration templates in BaseTemplate; they do not remove the core OpenTelemetry packages by themselves in minimal hosts.
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
OpenTelemetry (OpenTelemetry) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
OTel: collector (UseOtelCollector) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
OTel: direct export (UseDirectExport) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Backend: ELK (UseElkStack) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Backend: Prometheus + Grafana (UsePrometheusGrafana) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Backend: Seq (UseSeqBackend) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Backend: Azure Monitor (UseAzureMonitorBackend) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Backend: Application Insights (UseApplicationInsightsBackend) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Backend: Jaeger (UseJaegerBackend) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Application Insights (SDK / app) (UseApplicationInsights) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Resource monitoring (ResourceMonitoring) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
HTTP request latency (ConnectSoft.Extensions.Telemetry)
Not an MSBuild toggle: ConnectSoft.Extensions.Telemetry is referenced from ConnectSoft.BaseTemplate.ApplicationModel (and Layer 3 host Application / ApplicationModel projects) for HTTP request latency export. Registration flows through MicroserviceRegistrationBase: AddMicroserviceLatencyTelemetryCollection / UseMicroserviceLatencyTelemetryCollection, which delegate to AddConnectSoftRequestLatencyTelemetry / UseConnectSoftRequestLatencyTelemetry. Configuration section ConnectSoftLatencyTelemetry is validated at startup (strict binding). See Latency telemetry and submodule base-template/docs/Latency Monitoring.md.
| Concern |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
| ConnectSoft.Extensions.Telemetry on ApplicationModel + Application (HTTP-capable hosts) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Configuration, feature flags, compliance (packages tied to symbols)
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
Feature flags (FeatureFlags) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Azure App Configuration: feature flags provider (UseAzureAppConfigurationAsFeatureFlagsProvider) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Azure App Configuration: extra configuration (UseAzureAppConfigurationAsAdditionalConfigurationProvider) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
ConnectSoft.Extensions.Compliance + redaction packages in ApplicationModel are tied to these global patterns; hosts do not generally turn off Compliance with a single Use* flag in the minimal fragments (still compiled via ApplicationModel).
Caching
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
Distributed cache: Redis (DistributedCacheRedis) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Distributed cache: memory (DistributedCacheInMemory) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Distributed cache: none (DistributedCacheNone) |
N |
N |
N |
N |
N |
N |
N |
N |
N |
N |
N |
N |
Persistence and data access
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
NHibernate (UseNHibernate) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
NHibernate 2nd-level cache: Redis (UseRedisAsNHibernateSecondLevelCache) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
SQL Server dialect (UseSqlServerNHibernateDialect) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
PostgreSQL dialect (UsePostgreSQLNHibernateDialect) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
MySQL dialect (UseMySqlNHibernateDialect) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
MongoDB (UseMongoDb) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Migrations (Migrations) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
Messaging
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
NServiceBus (UseNServiceBus) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
NServiceBus SQL persistence (UseNServiceBusSQLPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
NServiceBus Mongo persistence (UseNServiceBusMongoDBPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
NServiceBus Cosmos persistence (UseNServiceBusCosmosDBPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
NServiceBus SQL transport (UseNServiceBusSqlServerTransport) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
NServiceBus RabbitMQ transport (UseNServiceBusRabbitMQTransport) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit (UseMassTransit) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit NHibernate persistence (UseMassTransitNHibernatePersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit Mongo persistence (UseMassTransitMongoDBPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit Cosmos persistence (UseMassTransitCosmosDBPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit Dapper persistence (UseMassTransitDapperPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit SQL transport (UseMassTransitSqlServerTransport) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit RabbitMQ transport (UseMassTransitRabbitMQTransport) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MassTransit Azure Service Bus transport (UseMassTransitAzureServiceBusTransport) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
Messaging graph disabled (MessagingModelTypeNone) |
N |
N |
N |
N |
N |
Y |
N |
N |
N |
N |
N |
N |
Actors and distributed runtime
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
Orleans (UseOrleans) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
N† |
Y |
Y |
Orleans ADO grain persistence (UseOrleansAdoNetGrainPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
N† |
Y |
Y |
Orleans Azure blob grain persistence (UseOrleansAzureBlobStorageGrainPersistence) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
N |
N† |
Y |
Y |
Dapr actors (UseDapr) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
Y |
Y |
Y |
Y |
Akka actors (UseAkka) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
Y |
Y |
Y |
Y |
† HC-S: Orleans forced off for base-template/ paths (HealthChecksSatelliteOrleansOff.props) to avoid tooling conflicts (see that file’s comment).
Service models (HTTP / RPC / real-time / serverless)
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
REST (UseRestApi) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
gRPC contracts (UseGrpc) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
gRPC Kestrel hosting (UseGrpcHosting) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
GraphQL (UseGraphQL) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
Y |
Y |
Y |
Y |
CoreWCF (UseCoreWCF) — SOAP, fault contracts |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
Y |
Y |
Y |
Y |
SignalR (UseSignalR) |
Y |
Y |
Y |
N |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
SignalR: no backplane (UseNoneSignalRBackplane) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
SignalR: Redis backplane (UseRedisSignalRBackplane) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Azure Functions surface (UseAzureFunction) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
Y |
Y |
Service Fabric surface (UseServiceFabric) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
Y |
Y |
Y |
Y |
Schedulers, audit, automation
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
HangFire (UseHangFire) |
Y |
Y |
Y |
N |
Y |
N |
Y |
Y |
N |
Y |
Y |
Y |
Audit.Net (UseAuditNet) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
MCP (UseMCP) |
Y |
Y |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Y |
Y |
Microsoft.Extensions.AI, Agent Framework, vectors, LLM flags
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
Microsoft.Extensions.AI (UseMicrosoftExtensionsAI) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Embeddings (UseMicrosoftExtensionsAIEmbedding) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
OpenAI provider (UseMicrosoftExtensionsAIOpenAIProvider) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Azure OpenAI provider (UseMicrosoftExtensionsAIAzureOpenAIProvider) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Azure AI Inference provider (UseMicrosoftExtensionsAIAzureAIInferenceProvider) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Ollama provider (UseMicrosoftExtensionsAIOllamaProvider) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
| Embedding providers (OpenAI / Azure / Ollama / Inference) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
AI evaluation (UseMicrosoftExtensionsAIEvaluation) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Microsoft Agent Framework (UseMicrosoftAgentFramework) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Agent Framework OpenAI (UseMicrosoftAgentFrameworkOpenAI) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Agent Framework Azure AI (UseMicrosoftAgentFrameworkAzureAI) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Agent Framework workflows (UseMicrosoftAgentFrameworkWorkflows) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Semantic Kernel Azure AI Search connector (UseSemanticKernelAzureAISearchConnector) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Semantic Kernel SQL Server connector (UseSemanticKernelSqlServerConnector) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector store (any) (UseVectorStore) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector: in-memory (UseVectorStoreInMemory) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector: Azure AI Search (UseVectorStoreAzureAISearch) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector: SQL Server (UseVectorStoreSqlServer) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector: PGVector (UseVectorStorePgVector) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector: Qdrant (UseVectorStoreQdrant) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Vector ingestion (UseVectorIngestion, chunkers, host) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
OpenAI / Azure OpenAI / Ollama (legacy flags) (UseOpenAI, UseAzureOpenAI, UseOllama) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
Agent RAG / skills (UseAgentFrameworkRag, UseAgentSkills) |
Y |
Y |
Y |
N |
Y |
N |
Y |
N |
N |
Y |
N |
Y |
BaseTemplate sample “GenerateFeature*” demos
| Feature |
BT |
MS |
Bot |
Id-H |
Id-S |
GW-H |
GW-S |
Wr |
HC-H |
HC-S |
AS-H |
AS-S |
| GenerateFeatureA (+ use cases) |
Y |
Y |
Y |
N |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
| GenerateFeatureB (+ use cases) |
Y |
Y |
Y |
N |
Y |
Y |
Y |
N |
Y |
Y |
Y |
Y |
Repository infrastructure (not the same as MSBuild Use*)
These rows describe repo layout / CI, not the table above. Y = present at repository root (or default product path) in the workspace snapshot.
| Capability |
BT |
MS |
Bot |
Identity |
ApiGateway |
Worker |
HealthChecks |
AuthServer |
Docker MSBuild flag (Authoring) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Docker Compose .dcproj + compose YAML in root solution |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Kubernetes manifests in root solution (Deployment/kubernetes) |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
mkdocs.yml at repo root |
Y |
Y |
N‡ |
Y |
Y |
Y |
Y |
Y |
azure-pipelines-documentation.yml at repo root (MkDocs CI) |
Y |
Y |
N |
Y |
Y |
Y |
Y |
N |
Submodule carries BaseTemplate docs + base-template/azure-pipelines-documentation.yml |
— |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
‡ Bot: MkDocs config lives under base-template/mkdocs.yml (submodule), not at the Bot repo root.
Microsoft Bot Framework (exclusive extended template)
Only ConnectSoft.MicrosoftBotFrameworkTemplate adds the Bot Builder stack and BotModel project reference (see Directory.Packages.props → UseMicrosoftBotBuilder and ConnectSoft.MicrosoftBotFrameworkTemplate.ApplicationModel.csproj).
Representative additional packages (not in other extended templates’ ApplicationModel):
| Capability |
Bot template |
All other extended templates in this matrix |
| Microsoft.Bot.Builder |
Y |
— |
| Microsoft.Bot.Builder.Integration.AspNet.Core |
Y |
— |
| Microsoft.Bot.Builder.Dialogs |
Y |
— |
Bot Builder Application Insights (when UseApplicationInsights) |
Y |
— |
ConnectSoft.*.BotModel project |
Y |
— |
Testing
Layer 2 — ConnectSoft.BaseTemplate
| Type |
Project (typical path) |
| Unit |
tests/ConnectSoft.BaseTemplate.UnitTests |
| Architecture |
tests/ConnectSoft.BaseTemplate.ArchitectureTests |
| Acceptance |
tests/ConnectSoft.BaseTemplate.AcceptanceTests |
Layer 3 — extended templates (root .slnx)
Each extended template renames test projects to ConnectSoft.<Product>.*Tests and includes Acceptance, Architecture, and Unit where present. The submodule still contains BaseTemplate’s own three test projects for satellite builds.
| Template |
Unit |
Architecture |
Acceptance |
Notes |
| Microservice |
Y |
Y |
Y |
|
| Identity |
Y |
Y |
Y |
|
| ApiGateway |
Y |
Y |
Y |
|
| Worker |
Y |
Y |
Y |
|
| Health Checks |
Y |
Y |
Y |
|
| Authorization Server |
Y |
Y |
Y |
|
| Microsoft Bot Framework |
Y |
Y |
Y |
Acceptance path may be top-level folder per .slnx |
Test technology: projects target .NET + MSTest / Microsoft Testing Platform (see Directory.Build.props TestingPlatformDotnetTestSupport for test projects). Acceptance tests typically drive WebApplicationFactory / integration scenarios; architecture tests enforce solution rules (see each repo’s ArchitectureTests).
ApplicationModel — typically always-on libraries (BaseTemplate)
The following are referenced from ConnectSoft.BaseTemplate.ApplicationModel.csproj without Condition on the item (or with conditions that stay true in full Authoring). Minimal hosts still compile ApplicationModel; they rely on DefineConstants / Use* overrides so optional code files are excluded — the packages may remain listed until you trim the csproj.
Use this as a catalog of cross-cutting building blocks, not as duplicate Y/N matrix rows:
| Concern |
Packages / wiring (examples) |
| Validation |
FluentValidation, ConnectSoft.Extensions.Validation.FluentValidation |
| HTTP / errors |
Microsoft.AspNetCore.HeaderPropagation, Microsoft.AspNetCore.Diagnostics.Middleware, Hellang.Middleware.ProblemDetails, ConnectSoft.AspNetCore.Http, ConnectSoft.Net.Http |
| Options |
Microsoft.Extensions.Options, Microsoft.Extensions.Options.DataAnnotations, ConnectSoft.Extensions.Options; project ref ConnectSoft.BaseTemplate.Options |
| Localization |
Microsoft.Extensions.Localization*, ConnectSoft.Extensions.Localization |
| Metrics / telemetry abstractions |
ConnectSoft.Extensions.Diagnostics.Metrics, ConnectSoft.Extensions.Telemetry (HTTP request latency export: logs + System.Diagnostics.Metrics + optional Activity enrichment), Microsoft.Extensions.Telemetry*; project ref ConnectSoft.BaseTemplate.Metrics |
| Service discovery |
Microsoft.Extensions.ServiceDiscovery* packages, ConnectSoft.Extensions.ServiceDiscovery |
| Compliance / redaction |
Microsoft.Extensions.Compliance*, ConnectSoft.Extensions.Compliance |
| Security headers / web security |
ConnectSoft.Extensions.WebSecurity, NetEscapades.AspNetCore.SecurityHeaders |
| Mapping |
AutoMapper |
| DI / resilience |
Microsoft.Extensions.DependencyInjection.AutoActivation, Polly, Scrutor |
| Domain / app model |
ConnectSoft.Extensions.ApplicationModel, ConnectSoft.Extensions.DomainModel*, ConnectSoft.Extensions.ServiceModel, ConnectSoft.Extensions |
| Transactions |
ConnectSoft.Extensions.Transactions |
| Identity protocols |
Microsoft.IdentityModel.*, System.IdentityModel.Tokens.Jwt |
| WCF primitives (for CoreWCF / faults) |
System.ServiceModel.Primitives (present even when UseCoreWCF is false — host may strip related projects) |
| Database clients (baseline) |
Microsoft.Data.SqlClient, MySql.Data, Npgsql, System.Data.Odbc |
CORS is enabled via MSBuild CORS and middleware packages; Swagger / Scalar via their Use* flags and Swashbuckle / Scalar packages.
Source files (for updates)
| Repo |
Entry props |
Host / satellite fragments |
| BaseTemplate |
— |
Authoring only; optional fallback ../build/DisableMicrosoftExtensionsStackForMinimalHost.props if present beside submodule in a host repo. |
| Microservice |
Empty ConnectSoft.TemplateRepositoryDirectory.Build.props |
— |
| Bot |
→ build/MinimalHostNoOp.props |
— |
| Identity |
→ build/DisableMicrosoftExtensionsStackForMinimalHost.props |
IdentityHost.props; satellite: ExtendedHost.BaseTemplateSatelliteDefaults.props |
| ApiGateway |
same entry |
GatewayHost.props + .targets |
| Worker |
→ build/DisableMicrosoftExtensionsStackForWorkerHost.props |
WorkerHost.Minimal.props (always); satellite also ExtendedHost |
| Health Checks |
same entry as Identity |
HealthChecksHost.props; satellite: ExtendedHost + HealthChecksSatelliteOrleansOff.props |
| Auth Server |
same entry as Identity |
AuthorizationServerHost.props; satellite: ExtendedHost |
Other template repositories (outside this MSBuild matrix)
Blazor, Maui, Library, Platform, AISkills, ConnectSoft.Templates*, etc. use different solution shapes and props. Compare their Directory.Build.props and packages directly.
Caveats
- DefineConstants manipulation: a property may read N while a package reference still exists — runtime behavior follows compiled
#if blocks and host trimming.
- Submodule revision:
base-template/ content tracks ConnectSoft.BaseTemplate at a pinned commit; this matrix assumes aligned props with the Layer 2 repo.
- Local-only file: may remain untracked; regenerate after changing any
build/Disable*.props or ExtendedHost*.props.