CINXE.COM

<!doctype html> <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-reference/technologies/server/dotnet" data-has-hydrated="false"> <head> <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v3.7.0"> <title data-rh="true">OpenFeature .NET SDK | OpenFeature</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://openfeature.dev/img/opengraph.jpg"><meta data-rh="true" name="twitter:image" content="https://openfeature.dev/img/opengraph.jpg"><meta data-rh="true" property="og:url" content="https://openfeature.dev/docs/reference/technologies/server/dotnet"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="OpenFeature .NET SDK | OpenFeature"><meta data-rh="true" name="description" content="&lt;!--"><meta data-rh="true" property="og:description" content="&lt;!--"><link data-rh="true" rel="canonical" href="https://openfeature.dev/docs/reference/technologies/server/dotnet"><link data-rh="true" rel="alternate" href="https://openfeature.dev/docs/reference/technologies/server/dotnet" hreflang="en"><link data-rh="true" rel="alternate" href="https://openfeature.dev/docs/reference/technologies/server/dotnet" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://PH0VDWFP7Q-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="OpenFeature RSS Feed"> <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="OpenFeature Atom Feed"> <link rel="search" type="application/opensearchdescription+xml" title="OpenFeature" href="/opensearch.xml"> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.googletagmanager.com"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-ZG0JSPYJXZ"></script> <script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-ZG0JSPYJXZ",{anonymize_ip:!0})</script> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon-precomposed.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png"> <link rel="icon" type="image/svg+xml" href="/favicons/favicon-light.svg"> <link rel="shortcut icon" type="image/x-icon" href="/favicons/favicon.ico"> <link rel="manifest" href="/favicons/site.webmanifest"> <meta name="theme-color" content="#ffffff"> <meta name="msapplication-config" content="/favicons/browserconfig.xml"><link rel="stylesheet" href="/assets/css/styles.385ab5b9.css"> <script src="/assets/js/runtime~main.aa35e229.js" defer="defer"></script> <script src="/assets/js/main.2feeef09.js" defer="defer"></script> </head> <body class="navigation-with-keyboard"> <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const a=new URLSearchParams(window.location.search).entries();for(var[t,e]of a)if(t.startsWith("docusaurus-data-")){var n=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(n,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/logo-dark.svg"><link rel="preload" as="image" href="/img/logo-light.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">We're back! Check out all the ways you can connect with us at <a href="/blog/kubeconeu25">KubeCon + CloudNativeCon Europe 2025</a>.</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo-dark.svg" alt="OpenFeature Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo-light.svg" alt="OpenFeature Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate"></b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/reference/intro">Docs</a><a class="navbar__item navbar__link" href="/specification/">Specification</a><a class="navbar__item navbar__link" href="/ecosystem">Ecosystem</a><a class="navbar__item navbar__link" href="/community/">Community</a><a class="navbar__item navbar__link" href="/support-training">Support &amp; Training</a><a class="navbar__item navbar__link" href="/docs/tutorials/five-minutes-to-feature-flags">Tutorials</a><a class="navbar__item navbar__link" href="/blog">Blog</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub organization"></a><div class="toggle_nTvT colorModeToggle_DEke"><button class="clean-btn toggleButton_gYZh toggleButtonDisabled_zh5C" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><div class="toggleLogo_HXbd"><div class="toggleIcon_U8RU"><div class="track_Vm51"><div></div></div></div></div></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/reference/intro">Introduction</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/category/concepts">Concepts</a><button aria-label="Collapse sidebar category &#x27;Concepts&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/evaluation-api">Evaluation API</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/provider">Providers</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/evaluation-context">Evaluation Context</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/hooks">Hooks</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/events">Events</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/sdk-paradigms">SDK Paradigms</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/tracking">Tracking</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/docs/reference/technologies/">Technologies</a><button aria-label="Collapse sidebar category &#x27;Technologies&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/sdk-compatibility">SDK Compatibility Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/docs/reference/technologies/server/">Server</a><button aria-label="Collapse sidebar category &#x27;Server&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/reference/technologies/server/dotnet">.NET</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/go">Go</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/java">Java</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/reference/technologies/server/javascript/">Node.js</a><button aria-label="Collapse sidebar category &#x27;Node.js&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/javascript/nestjs">NestJS</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/php">PHP</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/python">Python</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/ruby">Ruby</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/rust">Rust</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/reference/technologies/client/">Client</a><button aria-label="Collapse sidebar category &#x27;Client&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/kotlin">Android</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/swift">iOS</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/reference/technologies/client/web/">Web</a><button aria-label="Collapse sidebar category &#x27;Web&#x27;" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/web/angular">Angular</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/web/react">React</a></li></ul></li></ul></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/reference/contributing">Contributing</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/reference/technologies/"><span itemprop="name">Technologies</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/reference/technologies/server/"><span itemprop="name">Server</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">.NET</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>OpenFeature .NET SDK</h1></header><p><a href="https://github.com/open-feature/spec/releases/tag/v0.7.0" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/static/v1?label=specification&amp;message=v0.7.0&amp;color=yellow&amp;style=for-the-badge" alt="Specification" class="img_ev3q"></a> <a href="https://github.com/open-feature/dotnet-sdk/releases/tag/v2.3.1" target="_blank" rel="noopener noreferrer"> <img decoding="async" loading="lazy" src="https://img.shields.io/static/v1?label=release&amp;message=v2.3.1&amp;color=blue&amp;style=for-the-badge" alt="Release" class="img_ev3q"> </a></p> <p><a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/badge/slack-%40cncf%2Fopenfeature-brightgreen?style=flat&amp;logo=slack" alt="Slack" class="img_ev3q"></a> <a href="https://codecov.io/gh/open-feature/dotnet-sdk" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://codecov.io/gh/open-feature/dotnet-sdk/branch/main/graph/badge.svg?token=MONAVJBXUJ" alt="Codecov" class="img_ev3q"></a> <a href="https://www.nuget.org/packages/OpenFeature" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://img.shields.io/nuget/vpre/OpenFeature" alt="NuGet" class="img_ev3q"></a> <a href="https://www.bestpractices.dev/en/projects/6250" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" src="https://bestpractices.coreinfrastructure.org/projects/6250/badge" alt="CII Best Practices" class="img_ev3q"></a></p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick start<a href="#quick-start" class="hash-link" aria-label="Direct link to Quick start" title="Direct link to Quick start">​</a></h2> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="requirements">Requirements<a href="#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements">​</a></h3> <ul> <li>.NET 8+</li> <li>.NET Framework 4.6.2+</li> </ul> <p>Note that the packages will aim to support all current .NET versions. Refer to the currently supported versions <a href="https://dotnet.microsoft.com/download/dotnet" target="_blank" rel="noopener noreferrer">.NET</a> and <a href="https://dotnet.microsoft.com/download/dotnet-framework" target="_blank" rel="noopener noreferrer">.NET Framework</a> excluding .NET Framework 3.5</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="install">Install<a href="#install" class="hash-link" aria-label="Direct link to Install" title="Direct link to Install">​</a></h3> <p>Use the following to initialize your project:</p> <div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">dotnet new console</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>and install OpenFeature:</p> <div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">dotnet add package OpenFeature</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage">​</a></h3> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">async</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">Example</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Register your feature flag provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">InMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Create a new client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FeatureClient</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Evaluate your feature flag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">bool</span><span class="token plain"> v2Enabled </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;v2_enabled&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain"> v2Enabled </span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">//Do some work</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">​</a></h2> <table><thead><tr><th>Status</th><th>Features</th><th>Description</th></tr></thead><tbody><tr><td>✅</td><td><a href="#providers">Providers</a></td><td>Integrate with a commercial, open source, or in-house feature management tool.</td></tr><tr><td>✅</td><td><a href="#targeting">Targeting</a></td><td>Contextually-aware flag evaluation using <a href="/docs/reference/concepts/evaluation-context">evaluation context</a>.</td></tr><tr><td>✅</td><td><a href="#hooks">Hooks</a></td><td>Add functionality to various stages of the flag evaluation life-cycle.</td></tr><tr><td>✅</td><td><a href="#tracking">Tracking</a></td><td>Associate user actions with feature flag evaluations.</td></tr><tr><td>✅</td><td><a href="#logging">Logging</a></td><td>Integrate with popular logging packages.</td></tr><tr><td>✅</td><td><a href="#domains">Domains</a></td><td>Logically bind clients with providers.</td></tr><tr><td>✅</td><td><a href="#eventing">Eventing</a></td><td>React to state changes in the provider or flag management system.</td></tr><tr><td>✅</td><td><a href="#shutdown">Shutdown</a></td><td>Gracefully clean up a provider during application shutdown.</td></tr><tr><td>✅</td><td><a href="#transaction-context-propagation">Transaction Context Propagation</a></td><td>Set a specific <a href="/docs/reference/concepts/evaluation-context">evaluation context</a> for a transaction (e.g. an HTTP request or a thread).</td></tr><tr><td>✅</td><td><a href="#extending">Extending</a></td><td>Extend OpenFeature with custom providers and hooks.</td></tr><tr><td>🔬</td><td><a href="#DependencyInjection">DependencyInjection</a></td><td>Integrate OpenFeature with .NET&#x27;s dependency injection for streamlined provider setup.</td></tr></tbody></table> <blockquote> <p>Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌ | Experimental: 🔬</p> </blockquote> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="providers">Providers<a href="#providers" class="hash-link" aria-label="Direct link to Providers" title="Direct link to Providers">​</a></h3> <p><a href="/docs/reference/concepts/provider">Providers</a> are an abstraction between a flag management system and the OpenFeature SDK. Here is <a href="/ecosystem?instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Provider&amp;instant_search%5BrefinementList%5D%5Btechnology%5D%5B0%5D=.NET">a complete list of available providers</a>.</p> <p>If the provider you&#x27;re looking for hasn&#x27;t been created yet, see the <a href="#develop-a-provider">develop a provider</a> section to learn how to build it yourself.</p> <p>Once you&#x27;ve added a provider as a dependency, it can be registered with OpenFeature like this:</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">MyProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>In some situations, it may be beneficial to register multiple providers in the same application. This is possible using <a href="#domains">domains</a>, which is covered in more detail below.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="targeting">Targeting<a href="#targeting" class="hash-link" aria-label="Direct link to Targeting" title="Direct link to Targeting">​</a></h3> <p>Sometimes, the value of a flag must consider some dynamic criteria about the application or user such as the user&#x27;s location, IP, email address, or the server&#x27;s location. In OpenFeature, we refer to this as <a href="/specification/glossary#targeting">targeting</a>. If the flag management system you&#x27;re using supports targeting, you can provide the input data using the <a href="/docs/reference/concepts/evaluation-context">evaluation context</a>.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// set a value to the global context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContextBuilder</span><span class="token plain"> builder </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> EvaluationContext</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;region&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;us-east-1&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> apiCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">apiCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// set a value to the client context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">builder </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> EvaluationContext</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;region&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;us-east-1&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> clientCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">clientCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// set a value to the invocation context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">builder </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> EvaluationContext</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;region&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;us-east-1&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> reqCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">bool</span><span class="token plain"> flagValue </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValuAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;some-flag&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> reqCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="hooks">Hooks<a href="#hooks" class="hash-link" aria-label="Direct link to Hooks" title="Direct link to Hooks">​</a></h3> <p><a href="/docs/reference/concepts/hooks">Hooks</a> allow for custom logic to be added at well-defined points of the flag evaluation life-cycle. Look <a href="/ecosystem/?instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Hook&amp;instant_search%5BrefinementList%5D%5Bcategory%5D%5B0%5D=Server-side&amp;instant_search%5BrefinementList%5D%5Btechnology%5D%5B0%5D=.NET">here</a> for a complete list of available hooks. If the hook you&#x27;re looking for hasn&#x27;t been created yet, see the <a href="#develop-a-hook">develop a hook</a> section to learn how to build it yourself.</p> <p>Once you&#x27;ve added a hook as a dependency, it can be registered at the global, client, or flag invocation level.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// add a hook globally, to run on all evaluations</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHooks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">ExampleGlobalHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// add a hook on this client, to run on all evaluations made by this client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHooks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">ExampleClientHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// add a hook for this evaluation only</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">value</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetBooleanValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;boolFlag&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">FlagEvaluationOptions</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">ExampleInvocationHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="logging">Logging<a href="#logging" class="hash-link" aria-label="Direct link to Logging" title="Direct link to Logging">​</a></h3> <p>The .NET SDK uses Microsoft.Extensions.Logging. See the <a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line" target="_blank" rel="noopener noreferrer">manual</a> for complete documentation.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="logging-hook">Logging Hook<a href="#logging-hook" class="hash-link" aria-label="Direct link to Logging Hook" title="Direct link to Logging Hook">​</a></h4> <p>The .NET SDK includes a LoggingHook, which logs detailed information at key points during flag evaluation, using Microsoft.Extensions.Logging structured logging API. This hook can be particularly helpful for troubleshooting and debugging; simply attach it at the global, client or invocation level and ensure your log level is set to &quot;debug&quot;.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> loggerFactory </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> LoggerFactory</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Create</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">builder </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddConsole</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> logger </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> loggerFactory</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">CreateLogger</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;Program&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHooks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">LoggingHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">logger</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>See <a href="#hooks">hooks</a> for more information on configuring hooks.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="domains">Domains<a href="#domains" class="hash-link" aria-label="Direct link to Domains" title="Direct link to Domains">​</a></h3> <p>Clients can be assigned to a domain. A domain is a logical identifier which can be used to associate clients with a particular provider. If a domain has no associated provider, the default provider is used.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// registering the default provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">LocalProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// registering a provider to a domain</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;clientForCache&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">CachedProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// a client backed by default provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">FeatureClient</span><span class="token plain"> clientDefault </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// a client backed by CachedProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">FeatureClient</span><span class="token plain"> scopedClient </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;clientForCache&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Domains can be defined on a provider during registration. For more details, please refer to the <a href="#providers">providers</a> section.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="eventing">Eventing<a href="#eventing" class="hash-link" aria-label="Direct link to Eventing" title="Direct link to Eventing">​</a></h3> <p>Events allow you to react to state changes in the provider or underlying flag management system, such as flag definition changes, provider readiness, or error conditions. Initialization events (<code>PROVIDER_READY</code> on success, <code>PROVIDER_ERROR</code> on failure) are dispatched for every provider. Some providers support additional events, such as <code>PROVIDER_CONFIGURATION_CHANGED</code>.</p> <p>Please refer to the documentation of the provider you&#x27;re using to see what events are supported.</p> <p>Example usage of an Event handler:</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">EventHandler</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">ProviderEventPayload</span><span class="token plain"> eventDetails</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> Console</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">WriteLine</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">eventDetails</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Type</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token class-name" style="color:#FAC863">EventHandlerDelegate</span><span class="token plain"> callback </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> EventHandler</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// add an implementation of the EventHandlerDelegate for the PROVIDER_READY event</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHandler</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">ProviderEventTypes</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">ProviderReady</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> callback</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>It is also possible to register an event handler for a specific client, as in the following example:</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token class-name" style="color:#FAC863">EventHandlerDelegate</span><span class="token plain"> callback </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> EventHandler</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> myClient </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;my-client&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> provider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">ExampleProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetProviderAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">myClient</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetMetadata</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> provider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">myClient</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHandler</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">ProviderEventTypes</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">ProviderReady</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> callback</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="tracking">Tracking<a href="#tracking" class="hash-link" aria-label="Direct link to Tracking" title="Direct link to Tracking">​</a></h3> <p>The <a href="/specification/sections/tracking">tracking API</a> allows you to use OpenFeature abstractions and objects to associate user actions with feature flag evaluations. This is essential for robust experimentation powered by feature flags. For example, a flag enhancing the appearance of a UI component might drive user engagement to a new feature; to test this hypothesis, telemetry collected by a hook(#hooks) or provider(#providers) can be associated with telemetry reported in the client&#x27;s <code>track</code> function.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">GetClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Track</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;visited-promo-page&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token named-parameter punctuation" style="color:#8dc891">trackingEventDetails</span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">TrackingEventDetailsBuilder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">99.77</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;currency&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;USD&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Note that some providers may not support tracking; check the documentation for your provider for more information.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="shutdown">Shutdown<a href="#shutdown" class="hash-link" aria-label="Direct link to Shutdown" title="Direct link to Shutdown">​</a></h3> <p>The OpenFeature API provides a close function to perform a cleanup of all registered providers. This should only be called when your application is in the process of shutting down.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// Shut down all providers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">await</span><span class="token plain"> Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">ShutdownAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="transaction-context-propagation">Transaction Context Propagation<a href="#transaction-context-propagation" class="hash-link" aria-label="Direct link to Transaction Context Propagation" title="Direct link to Transaction Context Propagation">​</a></h3> <p>Transaction context is a container for transaction-specific evaluation context (e.g. user id, user agent, IP). Transaction context can be set where specific data is available (e.g. an auth service or request handler) and by using the transaction context propagator it will automatically be applied to all flag evaluations within a transaction (e.g. a request or thread). By default, the <code>NoOpTransactionContextPropagator</code> is used, which doesn&#x27;t store anything. To register a <a href="https://learn.microsoft.com/en-us/dotnet/api/system.threading.asynclocal-1" target="_blank" rel="noopener noreferrer">AsyncLocal</a> context propagator, you can use the <code>SetTransactionContextPropagator</code> method as shown below.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// registering the AsyncLocalTransactionContextPropagator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetTransactionContextPropagator</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">AsyncLocalTransactionContextPropagator</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Once you&#x27;ve registered a transaction context propagator, you can propagate the data into request-scoped transaction context.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// adding userId to transaction context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> transactionContext </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> EvaluationContext</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Set</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;userId&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> userId</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">Build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">Api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Instance</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">SetTransactionContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">transactionContext</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Additionally, you can develop a custom transaction context propagator by implementing the <code>TransactionContextPropagator</code> interface and registering it as shown above.</p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="extending">Extending<a href="#extending" class="hash-link" aria-label="Direct link to Extending" title="Direct link to Extending">​</a></h2> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="develop-a-provider">Develop a provider<a href="#develop-a-provider" class="hash-link" aria-label="Direct link to Develop a provider" title="Direct link to Develop a provider">​</a></h3> <p>To develop a provider, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a new repository or included in <a href="https://github.com/open-feature/dotnet-sdk-contrib" target="_blank" rel="noopener noreferrer">the existing contrib repository</a> available under the OpenFeature organization. You’ll then need to write the provider by implementing the <code>FeatureProvider</code> interface exported by the OpenFeature SDK.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token type-list class-name" style="color:#FAC863">FeatureProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Metadata</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">GetMetadata</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Metadata</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;My Provider&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name keyword" style="color:#c5a5c5">bool</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveBooleanValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">bool</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token class-name punctuation" style="color:#8dc891">?</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve a boolean flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name keyword" style="color:#c5a5c5">string</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveStringValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token class-name punctuation" style="color:#8dc891">?</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve a string flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name keyword" style="color:#c5a5c5">int</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveIntegerValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">int</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve an int flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name keyword" style="color:#c5a5c5">double</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveDoubleValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">double</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token class-name punctuation" style="color:#8dc891">?</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve a double flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">override</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">Task</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">ResolutionDetails</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">Value</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">ResolveStructureValueAsync</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token plain"> flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token class-name punctuation" style="color:#8dc891">?</span><span class="token plain"> context </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CancellationToken</span><span class="token plain"> cancellationToken </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">default</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve an object flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="develop-a-hook">Develop a hook<a href="#develop-a-hook" class="hash-link" aria-label="Direct link to Develop a hook" title="Direct link to Develop a hook">​</a></h3> <p>To develop a hook, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a new repository or included in <a href="https://github.com/open-feature/dotnet-sdk-contrib" target="_blank" rel="noopener noreferrer">the existing contrib repository</a> available under the OpenFeature organization. Implement your own hook by conforming to the <code>Hook interface</code>. To satisfy the interface, all methods (<code>Before</code>/<code>After</code>/<code>Finally</code>/<code>Error</code>) need to be defined.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyHook</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">:</span><span class="token plain"> </span><span class="token type-list class-name" style="color:#FAC863">Hook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ValueTask</span><span class="token return-type class-name punctuation" style="color:#8dc891">&lt;</span><span class="token return-type class-name" style="color:#FAC863">EvaluationContext</span><span class="token return-type class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">BeforeAsync</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code to run before flag evaluation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ValueTask</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">AfterAsync</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FlagEvaluationDetails</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> details</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code to run after successful flag evaluation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ValueTask</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">ErrorAsync</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Exception</span><span class="token plain"> error</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code to run if there&#x27;s an error during before hooks or during flag evaluation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token return-type class-name" style="color:#FAC863">ValueTask</span><span class="token plain"> </span><span class="token generic-method function" style="color:#79b6f2">FinallyAsync</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&lt;</span><span class="token generic-method generic class-name" style="color:#FAC863">T</span><span class="token generic-method generic class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> context</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FlagEvaluationDetails</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name" style="color:#FAC863">T</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> evaluationDetails</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">IReadOnlyDictionary</span><span class="token class-name punctuation" style="color:#8dc891">&lt;</span><span class="token class-name keyword" style="color:#c5a5c5">string</span><span class="token class-name punctuation" style="color:#8dc891">,</span><span class="token class-name" style="color:#FAC863"> </span><span class="token class-name keyword" style="color:#c5a5c5">object</span><span class="token class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> hints </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code to run after all other stages, regardless of success/failure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Built a new hook? <a href="https://github.com/open-feature/openfeature.dev/issues/new?assignees=&amp;labels=hook&amp;projects=&amp;template=document-hook.yaml&amp;title=%5BHook%5D%3A+" target="_blank" rel="noopener noreferrer">Let us know</a> so we can add it to the docs!</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="dependencyinjection">DependencyInjection<a href="#dependencyinjection" class="hash-link" aria-label="Direct link to DependencyInjection" title="Direct link to DependencyInjection">​</a></h3> <div class="markdown-alert markdown-alert-note"><p class="markdown-alert-title"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"><path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"></path><path d="m8.93 6.588-2.29.287-.082.38.45.083c.294.07.352.176.288.469l-.738 3.468c-.194.897.105 1.319.808 1.319.545 0 1.178-.252 1.465-.598l.088-.416c-.2.176-.492.246-.686.246-.275 0-.375-.193-.304-.533zM9 4.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0"></path></svg>Note</p> <p> The OpenFeature.DependencyInjection and OpenFeature.Hosting packages are currently experimental. They streamline the integration of OpenFeature within .NET applications, allowing for seamless configuration and lifecycle management of feature flag providers using dependency injection and hosting services.</p> </div> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h4> <p>To set up dependency injection and hosting capabilities for OpenFeature, install the following packages:</p> <div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">dotnet add package OpenFeature.DependencyInjection</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">dotnet add package OpenFeature.Hosting</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="usage-examples">Usage Examples<a href="#usage-examples" class="hash-link" aria-label="Direct link to Usage Examples" title="Direct link to Usage Examples">​</a></h4> <p>For a basic configuration, you can use the InMemoryProvider. This provider is simple and well-suited for development and testing purposes.</p> <p><strong>Basic Configuration:</strong></p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddOpenFeature</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">featureBuilder </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> featureBuilder</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHostedFeatureLifecycle</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token comment" style="color:#999999">// From Hosting package</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">contextBuilder</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> serviceProvider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* Custom context configuration */</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddInMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p><strong>Domain-Scoped Provider Configuration:</strong> <br>To set up multiple providers with a selection policy, define logic for choosing the default provider. This example designates <code>name1</code> as the default provider:</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">Services</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddOpenFeature</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">featureBuilder </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> featureBuilder</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddHostedFeatureLifecycle</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">contextBuilder</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> serviceProvider</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token comment" style="color:#999999">/* Custom context configuration */</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddInMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;name1&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddInMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;name2&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddPolicyName</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">options </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Custom logic to select a default provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> options</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">DefaultNameSelector </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> serviceProvider </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;name1&quot;</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="registering-a-custom-provider">Registering a Custom Provider<a href="#registering-a-custom-provider" class="hash-link" aria-label="Direct link to Registering a Custom Provider" title="Direct link to Registering a Custom Provider">​</a></h3> <p>You can register a custom provider, such as <code>InMemoryProvider</code>, with OpenFeature using the <code>AddProvider</code> method. This approach allows you to dynamically resolve services or configurations during registration.</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">services</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddOpenFeature</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">builder </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">provider </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Resolve services or configurations as needed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> variants </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Dictionary</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">string</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">,</span><span class="token constructor-invocation class-name" style="color:#FAC863"> </span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">bool</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;on&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> flags </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Dictionary</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">string</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">,</span><span class="token constructor-invocation class-name" style="color:#FAC863"> Flag</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;feature-key&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Flag</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">bool</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">variants</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;on&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Register a custom provider, such as InMemoryProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">InMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">flags</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="adding-a-domain-scoped-provider">Adding a Domain-Scoped Provider<a href="#adding-a-domain-scoped-provider" class="hash-link" aria-label="Direct link to Adding a Domain-Scoped Provider" title="Direct link to Adding a Domain-Scoped Provider">​</a></h4> <p>You can also register a domain-scoped custom provider, enabling configurations specific to each domain:</p> <div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">services</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddOpenFeature</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">builder </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> builder</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">AddProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">&quot;my-domain&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">provider</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> domain</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Resolve services or configurations as needed for the domain</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> variants </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Dictionary</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">string</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">,</span><span class="token constructor-invocation class-name" style="color:#FAC863"> </span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">bool</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;on&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name keyword" style="color:#c5a5c5">var</span><span class="token plain"> flags </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Dictionary</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">string</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">,</span><span class="token constructor-invocation class-name" style="color:#FAC863"> Flag</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"> </span><span class="token interpolation-string string" style="color:#8dc891">$&quot;</span><span class="token interpolation-string interpolation punctuation" style="color:#8dc891">{</span><span class="token interpolation-string interpolation expression language-csharp">domain</span><span class="token interpolation-string interpolation punctuation" style="color:#8dc891">}</span><span class="token interpolation-string string" style="color:#8dc891">-feature-key&quot;</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">Flag</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&lt;</span><span class="token constructor-invocation class-name keyword" style="color:#c5a5c5">bool</span><span class="token constructor-invocation class-name punctuation" style="color:#8dc891">&gt;</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">variants</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">&quot;on&quot;</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// Register a domain-scoped custom provider such as InMemoryProvider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name" style="color:#FAC863">InMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">flags</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/open-feature/openfeature.dev/edit/main/docs/reference/technologies/server/dotnet.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/reference/technologies/server/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Server</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/reference/technologies/server/go"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Go</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#quick-start" class="table-of-contents__link toc-highlight">Quick start</a><ul><li><a href="#requirements" class="table-of-contents__link toc-highlight">Requirements</a></li><li><a href="#install" class="table-of-contents__link toc-highlight">Install</a></li><li><a href="#usage" class="table-of-contents__link toc-highlight">Usage</a></li></ul></li><li><a href="#features" class="table-of-contents__link toc-highlight">Features</a><ul><li><a href="#providers" class="table-of-contents__link toc-highlight">Providers</a></li><li><a href="#targeting" class="table-of-contents__link toc-highlight">Targeting</a></li><li><a href="#hooks" class="table-of-contents__link toc-highlight">Hooks</a></li><li><a href="#logging" class="table-of-contents__link toc-highlight">Logging</a></li><li><a href="#domains" class="table-of-contents__link toc-highlight">Domains</a></li><li><a href="#eventing" class="table-of-contents__link toc-highlight">Eventing</a></li><li><a href="#tracking" class="table-of-contents__link toc-highlight">Tracking</a></li><li><a href="#shutdown" class="table-of-contents__link toc-highlight">Shutdown</a></li><li><a href="#transaction-context-propagation" class="table-of-contents__link toc-highlight">Transaction Context Propagation</a></li></ul></li><li><a href="#extending" class="table-of-contents__link toc-highlight">Extending</a><ul><li><a href="#develop-a-provider" class="table-of-contents__link toc-highlight">Develop a provider</a></li><li><a href="#develop-a-hook" class="table-of-contents__link toc-highlight">Develop a hook</a></li><li><a href="#dependencyinjection" class="table-of-contents__link toc-highlight">DependencyInjection</a></li><li><a href="#registering-a-custom-provider" class="table-of-contents__link toc-highlight">Registering a Custom Provider</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Sections</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/reference/intro">Docs</a></li><li class="footer__item"><a class="footer__link-item" href="/specification">Specification</a></li><li class="footer__item"><a class="footer__link-item" href="/community">Community</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/tutorials/five-minutes-to-feature-flags">Tutorials</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://bsky.app/profile/openfeature.dev" target="_blank" rel="noopener noreferrer" class="footer__link-item">BlueSky<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/openfeature" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.linkedin.com/company/openfeature/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="footer__link-item">Join us on Slack<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/@openfeature" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.linuxfoundation.org/legal/trademark-usage" target="_blank" rel="noopener noreferrer" class="footer__link-item">Trademarks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"> <a href="https://www.netlify.com" target="_blank" rel="noreferrer noopener" aria-label="Deploys by Netlify"> <img src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg" alt="Deploys by Netlify" width="114" height="51"> </a> </li></ul></div></div><div class="footer__bottom text--center"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-1.81 -3.06 419.38 80.13" style="width:300px"><style>.st0{fill:#fff}</style><g id="XMLID_1_"><g id="XMLID_575_"><path id="XMLID_643_" d="M102.2 33c3.3 0 5.9-1.3 8-3.9l4.3 4.4c-3.4 3.8-7.3 5.7-11.9 5.7s-8.3-1.4-11.3-4.3-4.4-6.5-4.4-10.9 1.5-8.1 4.5-11 6.7-4.4 11.1-4.4c4.9 0 9 1.9 12.2 5.6l-4.1 4.7q-3.15-3.9-7.8-3.9c-2.5 0-4.6.8-6.4 2.4s-2.7 3.8-2.7 6.6.8 5 2.5 6.7c1.6 1.4 3.6 2.3 6 2.3" class="st0"></path><path id="XMLID_641_" d="M119.7 38.8V9.1h6.6v23.8H139v5.9z" class="st0"></path><path id="XMLID_638_" d="M168 34.7c-3 2.9-6.7 4.4-11.1 4.4s-8.1-1.5-11.1-4.4-4.5-6.6-4.5-10.9c0-4.4 1.5-8 4.5-10.9s6.7-4.4 11.1-4.4S165 10 168 12.9s4.5 6.6 4.5 10.9c0 4.4-1.5 8-4.5 10.9m-2.3-10.9c0-2.6-.9-4.9-2.6-6.8s-3.8-2.8-6.3-2.8-4.6.9-6.3 2.8-2.6 4.1-2.6 6.8c0 2.6.9 4.9 2.6 6.8s3.8 2.8 6.3 2.8 4.6-.9 6.3-2.8c1.8-1.9 2.6-4.1 2.6-6.8" class="st0"></path><path id="XMLID_636_" d="M186 31.2q1.65 2.1 4.5 2.1c2.85 0 3.4-.7 4.4-2.1 1.1-1.4 1.6-3.3 1.6-5.6V9.2h6.6v16.6q0 6.45-3.6 9.9c-3.6 3.45-5.4 3.5-9.1 3.5s-6.8-1.2-9.2-3.5q-3.6-3.45-3.6-9.9V9.2h6.6v16.4c.1 2.3.7 4.2 1.8 5.6" class="st0"></path><path id="XMLID_633_" d="M232.7 13c2.8 2.6 4.3 6.2 4.3 10.8s-1.4 8.3-4.1 11c-2.8 2.7-7 4-12.6 4H210V9.1h10.5c5.3 0 9.4 1.3 12.2 3.9m-4.8 17.7c1.6-1.5 2.4-3.8 2.4-6.7s-.8-5.2-2.4-6.7q-2.4-2.4-7.5-2.4h-3.7V33h4.2c3 0 5.3-.8 7-2.3" class="st0"></path><path id="XMLID_631_" d="M274.7 9.1h6.6v29.7h-6.6l-14.2-18.6v18.6h-6.6V9.1h6.2l14.6 19.1z" class="st0"></path><path id="XMLID_628_" d="m309.8 38.8-2.8-6.4h-12.5l-2.8 6.4h-7.1l12.8-29.7h6.4l12.8 29.7zM300.9 18l-3.7 8.6h7.4z" class="st0"></path><path id="XMLID_626_" d="M330.8 14.9v24h-6.6v-24h-8.4V9.2h23.5v5.7z" class="st0"></path><path id="XMLID_624_" d="M344 9.1h6.6v29.7H344z" class="st0"></path><path id="XMLID_622_" d="m368.9 28 7.6-18.9h7.2l-11.9 29.7h-5.6L354.3 9.1h7.2z" class="st0"></path><path id="XMLID_620_" d="M408.6 9.1V15h-14.8v6.1h13.3v5.7h-13.3V33h15.3v5.9h-21.9V9.2h21.4z" class="st0"></path><path id="XMLID_618_" d="M94.6 64.1c1.8 0 3.3-.7 4.5-2.2l2.4 2.5c-1.9 2.1-4.1 3.2-6.7 3.2s-4.7-.8-6.3-2.4c-1.7-1.6-2.5-3.7-2.5-6.1 0-2.5.8-4.5 2.5-6.2s3.8-2.5 6.2-2.5c2.7 0 5 1 6.9 3.1l-2.3 2.6c-1.2-1.5-2.6-2.2-4.4-2.2-1.4 0-2.6.5-3.6 1.4s-1.5 2.1-1.5 3.7.5 2.8 1.4 3.7c.9 1 2.1 1.4 3.4 1.4" class="st0"></path><path id="XMLID_615_" d="M118 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.2-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c.9-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_613_" d="m138.6 56.9-4.5 9.1h-2.2l-4.5-9.1v10.5h-3.7V50.7h5l4.3 9.1 4.3-9.1h5v16.7h-3.7z" class="st0"></path><path id="XMLID_610_" d="M157.9 52.3c1.2 1 1.8 2.5 1.8 4.6s-.6 3.6-1.8 4.5c-1.2 1-3 1.4-5.5 1.4h-2.2v4.6h-3.7V50.7h5.9c2.5.1 4.3.6 5.5 1.6m-2.7 6.5c.4-.5.7-1.2.7-2.2s-.3-1.6-.9-2-1.5-.6-2.7-.6h-2.1v5.6h2.5c1.2 0 2-.3 2.5-.8" class="st0"></path><path id="XMLID_608_" d="M167 63.1c.6.8 1.5 1.2 2.5 1.2s1.9-.4 2.5-1.2.9-1.8.9-3.2v-9.2h3.7V60c0 2.4-.7 4.3-2 5.6s-3 1.9-5.1 1.9-3.8-.7-5.1-2-2-3.2-2-5.6v-9.3h3.7v9.2q0 2.25.9 3.3" class="st0"></path><path id="XMLID_606_" d="M187.5 54v13.4h-3.7V54h-4.7v-3.2h13.2V54z" class="st0"></path><path id="XMLID_604_" d="M195 50.8h3.7v16.7H195z" class="st0"></path><path id="XMLID_602_" d="M214.4 50.8h3.7v16.7h-3.7l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7V50.8z" class="st0"></path><path id="XMLID_600_" d="M233.1 59h3.7v5.9c-1.7 1.8-3.9 2.8-6.9 2.8-2.4 0-4.5-.8-6.2-2.4s-2.5-3.7-2.5-6.1c0-2.5.8-4.5 2.5-6.2s3.7-2.5 6.1-2.5 4.5.8 6.2 2.4l-1.9 2.8c-.7-.7-1.4-1.1-2.1-1.3-.6-.2-1.3-.4-2-.4-1.4 0-2.6.5-3.6 1.4-1 1-1.5 2.2-1.5 3.8s.5 2.8 1.4 3.8c.9.9 2 1.4 3.3 1.4s2.4-.2 3.2-.7V59z" class="st0"></path><path id="XMLID_598_" d="M257.8 50.8v3.3h-7.7v3.6h7.3V61h-7.3v6.5h-3.7V50.8z" class="st0"></path><path id="XMLID_595_" d="M275 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.3-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c1-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_593_" d="M285.1 63.1c.6.8 1.5 1.2 2.5 1.2s1.9-.4 2.5-1.2.9-1.8.9-3.2v-9.2h3.7V60c0 2.4-.7 4.3-2 5.6s-3 1.9-5.1 1.9-3.8-.7-5.1-2-2-3.2-2-5.6v-9.3h3.7v9.2c-.1 1.5.3 2.6.9 3.3" class="st0"></path><path id="XMLID_591_" d="M310.2 50.8h3.7v16.7h-3.7l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7V50.8z" class="st0"></path><path id="XMLID_588_" d="M330.7 53c1.6 1.5 2.4 3.5 2.4 6.1s-.8 4.6-2.3 6.1-3.9 2.3-7.1 2.3H318V50.8h5.9c3 0 5.3.7 6.8 2.2m-2.7 9.9c.9-.9 1.4-2.1 1.4-3.7s-.5-2.9-1.4-3.8-2.3-1.3-4.2-1.3h-2.1v10.1h2.4c1.7-.1 3-.5 3.9-1.3" class="st0"></path><path id="XMLID_585_" d="m347.7 67.4-1.5-3.6h-7l-1.5 3.6h-4l7.2-16.7h3.6l7.2 16.7zm-5-11.7-2.1 4.8h4.2z" class="st0"></path><path id="XMLID_583_" d="M359.5 54v13.4h-3.7V54H351v-3.2h13.2V54z" class="st0"></path><path id="XMLID_581_" d="M366.9 50.8h3.7v16.7h-3.7z" class="st0"></path><path id="XMLID_578_" d="M388.7 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.2-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c.9-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_576_" d="M406 50.8h3.7v16.7H406l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7z" class="st0"></path></g></g><g id="XMLID_197_"><g id="XMLID_392_"><path id="XMLID_397_" d="M15.5 47.7H6.4v21.4h21.3v-9.2H15.5z" class="st0"></path><path id="XMLID_395_" d="M61.3 47.8v12.1H49.1v-.1 9.3h21.3V47.7h-9.2z" class="st0"></path><path id="XMLID_394_" d="M6.4 26.4h9.2l-.1-.1V14.2h12.2V5H6.4z" class="st0"></path><path id="XMLID_393_" d="M49.1 5v9.2h12.2v12.2h9.1V5z" class="st0"></path></g><g id="XMLID_200_" opacity="0.8"><path id="XMLID_391_" d="M47.9 26.4 35.7 14.2h13.4V5H27.7v9.2l12.2 12.2z" class="st0"></path><path id="XMLID_390_" d="M36.9 47.7h-8L39 57.8l2 2.1H27.7v9.2h21.4v-9.3l-6.1-6z" class="st0"></path><path id="XMLID_389_" d="M61.3 26.4v13.3l-2.1-2.1-10.1-10.1v8.1l6 6 6.1 6.1h9.2V26.4z" class="st0"></path><path id="XMLID_388_" d="M27.7 38.5 15.6 26.4H6.4v21.3h9.1V34.4l12.2 12.2z" class="st0"></path></g></g></svg><div class="footer__copyright">© 2025 OpenFeature is a Cloud Native Computing Foundation incubating project | Documentation Distributed under CC BY 4.0 | All Rights Reserved</div></div></div></footer></div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10