Skip to content

Configuration ​

The Client Builder is designed to be easy to plug into your ASP.NET Core application using dependency injection (IServiceCollection). Its main configuration is handled through the ClientBuilderOptions class — where you:

  • Register assemblies to scan.
  • Define clients (where generated code goes).
  • Add scanning rules.
  • Register scaffold modules.

Registration ​

You configure the Client Builder in your Program.cs or Startup.cs:

csharp
builder.Services.AddClientBuilder(options =>
{
    // Add the assemblies you want to scan
    options.AddAssembly("MyApp.Domain");
    options.AddAssembly(typeof(MyApiController).Assembly);

    // Add your clients (output folders for generated code)
    options.AddClient(
        clientId: "web-client",
        clientName: "MyWebClient",
        amountDirectoriesBack: 2,
        "Clients", "WebClient", "src");

    // Add any custom scanning rules
    options.AddScanningRules(new MyCustomScanningRules());

    // Register scaffold modules (optional, if needed)
    options.AddModule<MyCustomModule>();
});

How it works ​

StepWhat it does
AddAssemblyRegisters one or more assemblies to be scanned for types, controllers, and DTOs.
AddClientDefines an output client (like a web app or mobile app) — this sets where generated code should be placed.
AddScanningRulesAdds custom rules for which types/controllers should be included.
AddModuleRegisters a code generation module — like a REST API generator, TypeScript generator, etc.

Example: Registering a Client ​

csharp
options.AddClient(
    clientId: "mobile-app",
    clientName: "MyMobileApp",
    amountDirectoriesBack: 3,
    "Clients", "MobileApp", "src");
  • clientId — A unique ID for this client (used to link modules).
  • clientName — A friendly name (used in logs and generated output).
  • amountDirectoriesBack — How many folders back from the current working dir to reach your solution root.
  • paths — The relative path from solution root to the client folder.

The result: The Client Builder will generate files into ../../../Clients/MobileApp/src.

Example: Adding a Custom Module ​

csharp
options.AddModule<MyCustomScaffoldModule>(moduleOptions =>
{
    moduleOptions.ClientId = "web-client";
    moduleOptions.Order = 1;
    moduleOptions.Name = "My REST Client Module";
});

How the Options Work ​

Assemblies ​

All Types, Controllers, and DTOs are discovered by scanning the assemblies you add:

csharp
options.AddAssembly("MyProject.Api");
options.AddAssembly(typeof(MyModel).Assembly);

Scanning Rules ​

Use IScanningRules to control which classes, enums, or controllers are included:

csharp
options.AddScanningRules(new DefaultControllersScanningRules());
options.AddScanningRules(new DefaultElementsScanningRules());

Modules ​

Modules are building blocks for code generation. A module can:

  • Generate a REST client.
  • Generate a GraphQL client.
  • Produce TypeScript/JavaScript files.
  • Any custom output logic.

You can register multiple modules for a single client:

csharp
options.AddModule<MyRestClientModule>();
options.AddModule<MyGraphQLClientModule>();

Each module uses the ScaffoldModuleOptions to:

  • Define which client it targets.
  • Set its execution order.
  • Control its name and ID.

Putting It All Together ​

Full example for your Program.cs:

csharp
builder.Services.AddClientBuilder(options =>
{
    // Scan your domain and API projects
    options.AddAssembly("MyApp.Domain");
    options.AddAssembly("MyApp.Api");

    // Add clients
    options.AddClient("web-client", "WebAppClient", 2, "Clients", "Web", "src");
    options.AddClient("mobile-client", "MobileAppClient", 3, "Clients", "Mobile", "src");

    // Add scanning rules
    options.AddScanningRules(new DefaultControllersScanningRules());
    options.AddScanningRules(new DefaultElementsScanningRules());

    // Register modules
    options.AddModule<MyCustomModule>(moduleOptions =>
    {
        moduleOptions.ClientId = "web-client";
        moduleOptions.Order = 1;
    });

    options.AddModule<AnotherCustomModule>(moduleOptions =>
    {
        moduleOptions.ClientId = "mobile-client";
        moduleOptions.Order = 2;
    });
});

TIPS

  • Always add at least one client — modules must be linked to a client.
  • Use amountDirectoriesBack to adjust the path relative to your solution root.
  • Add multiple assemblies if your app has separate projects for API, models, or contracts.
  • Use [IncludeElementAttribute] to explicitly mark types for inclusion if you want fine-grained control.

Released under the MIT License.