# optimizely/csharp-sdk architecture

> Architecture diagram of the GitHub repository optimizely/csharp-sdk, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/optimizely/csharp-sdk
- Repository: https://github.com/optimizely/csharp-sdk

## Overview

Optimizely’s C# SDK provides feature-flag and experimentation decisions, event tracking, and optional CMAB and ODP capabilities. The main workflow initializes a client with project data, creates a user context, evaluates flags or experiments, and can emit decision and conversion events. Configuration, bucketing, and event processing are distinct runtime stages. The README documents the public workflow; sampled source supports selected internal links, while unsampled subsystem links are omitted or marked unverified.

Main entry points: [`OptimizelySDK/Optimizely.cs`](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Optimizely.cs) (Optimizely Client), [`OptimizelySDK/Bucketing/DecisionService.cs`](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/DecisionService.cs) (Decision Service), [`OptimizelySDK/Odp/OdpManager.cs`](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpManager.cs) (ODP Manager), [`OptimizelySDK/OptimizelyFactory.cs`](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/OptimizelyFactory.cs) (Client Factory)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client and Config"]
  node_factory["Client Factory"]
  node_client["Optimizely Client<br/>[Optimizely.cs]"]
  node_configmanager["Config Manager"]
  node_projectconfig["Project Config"]
  node_notifications["Notifications"]
end

subgraph group_decision["Decision Runtime"]
  node_usercontext["User Context"]
  node_decisionservice["Decision Service<br/>[DecisionService.cs]"]
  node_bucketer["Experiment Bucketer<br/>[Bucketer.cs]"]
  node_audiences["Audience Evaluation"]
  node_forced["Forced Decisions"]
  node_userprofile["User Profiles"]
end

subgraph group_events["Event Delivery"]
  node_eventbuilder["Event Builder<br/>[EventBuilder.cs]"]
  node_eventprocessor["Event Processor<br/>[EventProcessor.cs]"]
  node_dispatcher["Event Dispatcher"]
end

subgraph group_integrations["Optional Integrations"]
  node_cmab["CMAB Service"]
  node_odpmanager["ODP Manager<br/>[OdpManager.cs]"]
  node_odpsegments["ODP Segments"]
  node_odpevents["ODP Event Manager<br/>[OdpEventManager.cs]"]
end

node_developer(("SDK Consumer"))
node_eventservice(("Event Endpoint"))
node_odpapi(("ODP Event API"))

node_developer -->|"initializes"| node_factory
node_factory -->|"creates"| node_client
node_client -->|"uses config"| node_configmanager
node_configmanager -->|"parses datafile"| node_projectconfig
node_client -->|"creates context"| node_usercontext
node_usercontext -.->|"requests decisions"| node_decisionservice
node_decisionservice -->|"buckets users"| node_bucketer
node_decisionservice -->|"requests CMAB"| node_cmab
node_decisionservice -->|"uses profiles"| node_userprofile
node_client -->|"sets overrides"| node_forced
node_client -.->|"builds events"| node_eventbuilder
node_client -->|"processes events"| node_eventprocessor
node_eventprocessor -.->|"dispatches events"| node_dispatcher
node_dispatcher -.->|"sends events"| node_eventservice
node_client -.->|"uses ODP"| node_odpmanager
node_odpmanager -->|"manages segments"| node_odpsegments
node_odpmanager -->|"manages events"| node_odpevents
node_odpevents -.->|"sends batches"| node_odpapi
node_client -->|"sends notifications"| node_notifications
node_projectconfig -.->|"supplies config"| node_decisionservice
node_decisionservice -.->|"evaluates audiences"| node_audiences

click node_factory "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/OptimizelyFactory.cs"
click node_client "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Optimizely.cs"
click node_configmanager "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Config/HttpProjectConfigManager.cs"
click node_projectconfig "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Config/DatafileProjectConfig.cs"
click node_usercontext "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/OptimizelyUserContext.cs"
click node_decisionservice "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/DecisionService.cs"
click node_bucketer "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/Bucketer.cs"
click node_audiences "https://github.com/optimizely/csharp-sdk/tree/master/OptimizelySDK/AudienceConditions"
click node_forced "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/ForcedDecisionsStore.cs"
click node_userprofile "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/UserProfileService.cs"
click node_cmab "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Cmab/DefaultCmabService.cs"
click node_eventbuilder "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Event/Builder/EventBuilder.cs"
click node_eventprocessor "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Event/EventProcessor.cs"
click node_dispatcher "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs"
click node_odpmanager "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpManager.cs"
click node_odpsegments "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpSegmentManager.cs"
click node_odpevents "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpEventManager.cs"
click node_notifications "https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Notifications/NotificationCenter.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_factory,node_client,node_configmanager,node_projectconfig,node_notifications toneBlue
class node_usercontext,node_decisionservice,node_bucketer,node_audiences,node_forced,node_userprofile toneAmber
class node_eventbuilder,node_eventprocessor,node_dispatcher,node_odpapi toneMint
class node_cmab,node_odpmanager,node_odpsegments,node_odpevents toneRose
class node_developer,node_eventservice toneIndigo
```

## Components

### Client and Config

- [Client Factory](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/OptimizelyFactory.cs): `OptimizelySDK/OptimizelyFactory.cs`
- [Optimizely Client](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Optimizely.cs): `OptimizelySDK/Optimizely.cs`
- [Config Manager](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Config/HttpProjectConfigManager.cs): `OptimizelySDK/Config/HttpProjectConfigManager.cs`
- [Project Config](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Config/DatafileProjectConfig.cs): `OptimizelySDK/Config/DatafileProjectConfig.cs`
- [Notifications](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Notifications/NotificationCenter.cs): `OptimizelySDK/Notifications/NotificationCenter.cs`

### Decision Runtime

- [User Context](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/OptimizelyUserContext.cs): `OptimizelySDK/OptimizelyUserContext.cs`
- [Decision Service](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/DecisionService.cs): `OptimizelySDK/Bucketing/DecisionService.cs`
- [Experiment Bucketer](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/Bucketer.cs): `OptimizelySDK/Bucketing/Bucketer.cs`
- [Audience Evaluation](https://github.com/optimizely/csharp-sdk/tree/master/OptimizelySDK/AudienceConditions): `OptimizelySDK/AudienceConditions`
- [Forced Decisions](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/ForcedDecisionsStore.cs): `OptimizelySDK/ForcedDecisionsStore.cs`
- [User Profiles](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Bucketing/UserProfileService.cs): `OptimizelySDK/Bucketing/UserProfileService.cs`

### Event Delivery

- [Event Builder](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Event/Builder/EventBuilder.cs): `OptimizelySDK/Event/Builder/EventBuilder.cs`
- [Event Processor](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Event/EventProcessor.cs): `OptimizelySDK/Event/EventProcessor.cs`
- [Event Dispatcher](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs): `OptimizelySDK/Event/Dispatcher/HttpClientEventDispatcher45.cs`

### Optional Integrations

- [CMAB Service](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Cmab/DefaultCmabService.cs): `OptimizelySDK/Cmab/DefaultCmabService.cs`
- [ODP Manager](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpManager.cs): `OptimizelySDK/Odp/OdpManager.cs`
- [ODP Segments](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpSegmentManager.cs): `OptimizelySDK/Odp/OdpSegmentManager.cs`
- [ODP Event Manager](https://github.com/optimizely/csharp-sdk/blob/master/OptimizelySDK/Odp/OdpEventManager.cs): `OptimizelySDK/Odp/OdpEventManager.cs`

### Other components

- **SDK Consumer**
- **Event Endpoint**
- **ODP Event API**

## Connections

- SDK Consumer → Client Factory: initializes (evidence: `README.md`)
- Client Factory → Optimizely Client: creates (evidence: `README.md`)
- Optimizely Client → Config Manager: uses config (evidence: `OptimizelySDK/Optimizely.cs`)
- Config Manager → Project Config: parses datafile (evidence: `OptimizelySDK/Config/HttpProjectConfigManager.cs`)
- Optimizely Client → User Context: creates context (evidence: `OptimizelySDK/Optimizely.cs`)
- User Context → Decision Service: requests decisions (evidence: `OptimizelySDK/Bucketing/DecisionService.cs`)
- Decision Service → Experiment Bucketer: buckets users (evidence: `OptimizelySDK/Bucketing/DecisionService.cs`)
- Decision Service → CMAB Service: requests CMAB (evidence: `OptimizelySDK/Bucketing/DecisionService.cs`)
- Decision Service → User Profiles: uses profiles (evidence: `OptimizelySDK/Bucketing/DecisionService.cs`)
- Optimizely Client → Forced Decisions: sets overrides (evidence: `README.md`)
- Optimizely Client → Event Builder: builds events (evidence: `OptimizelySDK/Optimizely.cs`)
- Optimizely Client → Event Processor: processes events (evidence: `OptimizelySDK/Optimizely.cs`)
- Event Processor → Event Dispatcher: dispatches events
- Event Dispatcher → Event Endpoint: sends events
- Optimizely Client → ODP Manager: uses ODP (evidence: `OptimizelySDK/Optimizely.cs`)
- ODP Manager → ODP Segments: manages segments (evidence: `OptimizelySDK/Odp/OdpManager.cs`)
- ODP Manager → ODP Event Manager: manages events (evidence: `OptimizelySDK/Odp/OdpManager.cs`)
- ODP Event Manager → ODP Event API: sends batches
- Optimizely Client → Notifications: sends notifications (evidence: `OptimizelySDK/Optimizely.cs`)
- Project Config → Decision Service: supplies config
- Decision Service → Audience Evaluation: evaluates audiences
