Namespace: Ocelot.DependencyInjectionSource code: DependencyInjection
- AddOcelot adds required Ocelot services to DI and it adds default services using AddDefaultAspNetServices method.
- AddOcelotUsingBuilder adds required Ocelot services to DI, and it adds custom ASP.NET services with configuration injected implicitly or explicitly.
Use :ref:`di-service-extensions` in in the following ConfigureServices
method (Program.cs and Startup.cs) of your ASP.NET MVC gateway app (minimal web app) to add/build Ocelot pipeline services:
namespace Microsoft.AspNetCore.Hosting;
public interface IWebHostBuilder
{
IWebHostBuilder ConfigureServices(Action<IServiceCollection> configureServices);
}
The fact is, the OcelotBuilder class is Ocelot's cornerstone logic.
Namespace:Ocelot.DependencyInjection
Class: ServiceCollectionExtensions
Based on the current implementations for the OcelotBuilder class, the AddOcelot method adds required ASP.NET services to DI container.
You could call another more extended AddOcelotUsingBuilder method while configuring services to build and use custom builder via an IMvcCoreBuilder
object.
Signatures:
IOcelotBuilder AddOcelot(this IServiceCollection services);
IOcelotBuilder AddOcelot(this IServiceCollection services, IConfiguration configuration);
These IServiceCollection
extension methods add default ASP.NET services and Ocelot application services with configuration injected implicitly or explicitly.
Note! Both methods add required and default ASP.NET services for Ocelot pipeline in the AddDefaultAspNetServices method which is default builder.
In this scenario, you do nothing other than call the AddOcelot
method, which is often mentioned in feature chapters, if additional startup settings are required.
With this method, you simply reuse the default settings to build the Ocelot pipeline. The alternative is AddOcelotUsingBuilder
method, see the next subsection.
Signatures:
using CustomBuilderFunc = System.Func<IMvcCoreBuilder, Assembly, IMvcCoreBuilder>;
IOcelotBuilder AddOcelotUsingBuilder(this IServiceCollection services, CustomBuilderFunc customBuilder);
IOcelotBuilder AddOcelotUsingBuilder(this IServiceCollection services, IConfiguration configuration, CustomBuilderFunc customBuilder);
These IServiceCollection
extension methods add Ocelot application services, and they add custom ASP.NET services with configuration injected implicitly or explicitly.
Note! The method adds custom ASP.NET services required for Ocelot pipeline using custom builder (aka customBuilder
parameter).
It is highly recommended to read docs of the AddDefaultAspNetServices method,
or even to review implementation to understand default ASP.NET services which are the minimal part of the gateway pipeline.
In this custom scenario, you control everything during ASP.NET MVC pipeline building, and you provide custom settings to build Ocelot pipeline.
Source code: Ocelot.DependencyInjection.OcelotBuilder
The OcelotBuilder
class is the core of Ocelot which does the following:
Contructs itself by single public constructor:
public OcelotBuilder(IServiceCollection services, IConfiguration configurationRoot, Func<IMvcCoreBuilder, Assembly, IMvcCoreBuilder> customBuilder = null);
Initializes and stores public properties: Services (
IServiceCollection
object), Configuration (IConfiguration
object) and MvcCoreBuilder (IMvcCoreBuilder
object)Adds all application services during construction phase over the
Services
propertyAdds ASP.NET services by builder using
Func<IMvcCoreBuilder, Assembly, IMvcCoreBuilder>
object in these 2 development scenarios:- by default builder (
AddDefaultAspNetServices
method) if there is nocustomBuilder
parameter provided - by custom builder with provided delegate object as the
customBuilder
parameter
- by default builder (
Adds (switches on/off) Ocelot features by:
AddSingletonDefinedAggregator
andAddTransientDefinedAggregator
methodsAddCustomLoadBalancer
methodAddDelegatingHandler
methodAddConfigPlaceholders
method
Class: OcelotBuilder
Currently the method is protected and overriding is forbidden.
The role of the method is to inject required services via both IServiceCollection
and IMvcCoreBuilder
interface objects for the minimal part of the gateway pipeline.
Current implementation is the folowing:
protected IMvcCoreBuilder AddDefaultAspNetServices(IMvcCoreBuilder builder, Assembly assembly)
{
Services
.AddLogging()
.AddMiddlewareAnalysis()
.AddWebEncoders();
return builder
.AddApplicationPart(assembly)
.AddControllersAsServices()
.AddAuthorization()
.AddJsonOptions(op =>
{
op.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
op.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
op.JsonSerializerOptions.WriteIndented = false;
op.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
op.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
}
The method cannot be overridden. It is not virtual, and there is no way to override current behavior by inheritance.
And, the method is default builder of Ocelot pipeline while calling the AddOcelot method.
As alternative, to "override" this default builder, you can design and reuse custom builder as a Func<IMvcCoreBuilder, Assembly, IMvcCoreBuilder>
delegate object
and pass it as parameter to the AddOcelotUsingBuilder extension method.
It gives you full control on design and buiding of Ocelot pipeline, but be careful while designing your custom Ocelot pipeline as customizable ASP.NET MVC pipeline.
Warning! Most of services from minimal part of the pipeline should be reused, but only a few of services could be removed.
Warning!! The method above is called after adding required services of ASP.NET MVC pipeline building by
AddMvcCore method
over the Services
property in upper calling context. These services are absolute minimum core services for ASP.NET MVC pipeline.
They must be added to DI container always, and they are added implicitly before calling of the method by caller in upper context.
So, AddMvcCore
creates an IMvcCoreBuilder
object with its assignment to the MvcCoreBuilder
property.
Finally, as a default builder, the method above receives IMvcCoreBuilder
object being ready for further extensions.
The next section shows you an example of designing custom Ocelot pipeline by custom builder.
Dependency Injection for the :doc:`../features/configuration` feature in Ocelot is designed to extend and/or control the configuration of Ocelot kernel before the stage of building ASP.NET MVC pipeline services.
To configure the Ocelot pipeline and services, use the :ref:`di-configuration-extensions` in the following ConfigureAppConfiguration
method (located in Program.cs and Startup.cs) of your minimal web app:
namespace Microsoft.AspNetCore.Hosting;
public interface IWebHostBuilder
{
IWebHostBuilder ConfigureAppConfiguration(Action<WebHostBuilderContext, IConfigurationBuilder> configureDelegate);
}
Namespace:Ocelot.DependencyInjection
The main methods are the :ref:`di-configuration-addocelot` within the ConfigurationBuilderExtensions class. This method has a list of overloaded versions with corresponding signatures.
The purpose of this method is to prepare everything before actually configuring with native extensions. It involves the following steps:
- Merging Partial JSON Files: The
GetMergedOcelotJson
method merges partial JSON files. - Selecting Merge Type: It allows you to choose a merge type to save the merged JSON configuration data either
ToFile
orToMemory
. - Framework Extensions: Finally, the method calls the following native
IConfigurationBuilder
framework extensions:- The
AddJsonFile
method adds the primary configuration file (commonly known as ocelot.json) after the merge stage. It writes the file back to the file system using theToFile
merge type option, which is implicitly the default. - The
AddJsonStream
method adds the JSON data of the primary configuration file as a UTF-8 stream into memory after the merge stage. It uses theToMemory
merge type option.
- The
Signatures of the most common versions:
IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, IWebHostEnvironment env);
IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, string folder, IWebHostEnvironment env);
Note: These versions use the implicit ToFile
merge type to write ocelot.json back to disk. Finally, they call the AddJsonFile
extension.
Signatures of the versions to specify a MergeOcelotJson
option:
IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, IWebHostEnvironment env, MergeOcelotJson mergeTo,
string primaryConfigFile = null, string globalConfigFile = null, string environmentConfigFile = null, bool? optional = null, bool? reloadOnChange = null);
IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, string folder, IWebHostEnvironment env, MergeOcelotJson mergeTo,
string primaryConfigFile = null, string globalConfigFile = null, string environmentConfigFile = null, bool? optional = null, bool? reloadOnChange = null);
Note: These versions include optional arguments to specify the location of the three main files involved in the merge operation. In theory, these files can be located anywhere, but in practice, it is better to keep them in one folder.
Signatures of the versions to indicate the FileConfiguration
object of a self-created out-of-the-box configuration: [1]
IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, FileConfiguration fileConfiguration,
string primaryConfigFile = null, bool? optional = null, bool? reloadOnChange = null);
IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, FileConfiguration fileConfiguration, IWebHostEnvironment env, MergeOcelotJson mergeTo,
string primaryConfigFile = null, string globalConfigFile = null, string environmentConfigFile = null, bool? optional = null, bool? reloadOnChange = null);
[1] | (1, 2) The Dynamic :doc:`../features/configuration` feature was requested in issues 1228 and 1235. It was delivered by PR 1569 as part of version 20.0. Since then, we have extended it in PR 1227 and released it as part of version 23.2. |