HomeDev GuideRecipesAPI ReferenceGraphQL
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityDoc feedbackLog In
GitHubNuGetDev CommunityDoc feedback

The `Client` class in the .NET Client API for Optimizely Search & Navigation covers common operations such as indexing objects, getting documents, deleting documents, and searching.

The `Client` class, abstracted by the `IClient` interface, acts as a gateway or façade for the Optimizely Search & Navigation service. The class covers most operations that you would want to perform, such as indexing objects, getting documents, deleting documents, and searching. The `Client` class methods do not, however, map directly to the service. These methods enforce several conventions, most of which can be customized, to provide additional functionality and a more convenient way of working with the service. `Client` is further enhanced by several extension methods, most notably the `Search` method, the starting point for building search requests using a fluent API.

## Obtain an IClient instance

The `Client` class can be instantiated directly, but its constructor requires a number of parameters. As these parameters primarily concern configuration details, the `Client` class also has a parameter-less static method, `CreateFromConfig`, that returns an instance of the class based on configuration settings. To use the `Client.CreateFromConfig` method, you must first add a configuration section to your solution. See [.NET Client API](🔗).

With that in place, you can easily obtain an instance of the `Client` class:

## Manage instances

Creating an instance of the `Client` class is not a very costly operation but performance may be affected. In many scenarios, you also want to modify the instance prior to usage, meaning you want to instantiate it on application startup. Therefore, it is recommended to only use a single instance per application, or a few long-lived instances with different settings/conventions.

You can accomplish this in several ways, depending on the type of application in which the `Client` class is being used. In an ASP.NET MVC web site, you can configure the `DependencyResolver` to automatically inject the instance into controllers. Likewise, an `Inversion` of `Control` container can inject the instance into the presenter in a Web Forms site that uses the MVP pattern. In other situations, you can manage the instance in a custom class in a Singleton-like fashion. The following example illustrates how to wire up injection of the `Client` class into controllers in an ASP.NET site that uses the Autofac MVC integration.

### Use Client instance with CMS


Do not create a new instance of `IClient` if you are using Optimizely Search & Navigation with Optimizely Content Management System (CMS), since content indexing and index querying may fail.

When using Optimizely Search & Navigation with CMS, you should never create a new instance of `IClient`.

If you have `EPiServer.Find.Cms` installed, there is already a configured instance in `SearchClient.Instance`. Because `Client` holds the convention information, if an instance is created _after_ the conventions are applied, it may cause the content indexing and querying to fail, as previous configurations will be overwritten.

Instead, use `SearchClient.Instance` to get an instance of `IClient`, configured through an initialization module in `EPiServer.Find.Cms`.