﻿# Customizing the data bus


Endpoints support sending and receiving large chunks of data via the [data bus](index.md).

It is possible to create a custom data bus implementation. This is done by using the [Features](/nservicebus/pipeline/features.md) extension.



## Implement the `IDataBus` interface

This new class will provide the custom implementations for the `Get` and `Put` methods for the data bus.

<!-- snippet: CustomDataBus -->

```cs
class CustomClaimCheck :
    IClaimCheck
{
    public Task<Stream> Get(string key, CancellationToken cancellationToken)
    {
        Stream stream = File.OpenRead("blob.dat");
        return Task.FromResult(stream);
    }

    public async Task<string> Put(Stream stream, TimeSpan timeToBeReceived, CancellationToken cancellationToken)
    {
        await using var destination = File.OpenWrite("blob.dat");
        await stream.CopyToAsync(destination, 81920, cancellationToken);
        return "the-key-of-the-stored-file-such-as-the-full-path";
    }

    public Task Start(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}
```

<!-- endsnippet -->

This new implementation needs to be registered as a new feature.

## Define a feature

Define a [new feature](/nservicebus/pipeline/features.md) that registers the custom data bus implementation class.

<!-- snippet: CustomDataBusFeature -->

```cs
class CustomClaimCheckFeature : Feature
{
    public CustomClaimCheckFeature()
        => DependsOn<ClaimCheck>();

    protected override void Setup(FeatureConfigurationContext context)
        => context.Services.AddSingleton<IClaimCheck, CustomClaimCheck>();
}
```

<!-- endsnippet -->

## Define a DataBusDefinition

Define a new class that inherits from the `DataBusDefinition` class.

<!-- snippet: CustomDataBusDefinition -->

```cs
class CustomClaimCheckDefinition : ClaimCheckDefinition
{
    protected override void EnableFeature(SettingsHolder settings) => settings.EnableFeature<CustomClaimCheckFeature>();
}
```

<!-- endsnippet -->

## Configure the endpoint

Configure the endpoint to use the custom data bus implementation instead of the default data bus:

<!-- snippet: PluginCustomDataBus -->

```cs
endpointConfiguration.UseClaimCheck(svc => new CustomClaimCheck(), new SystemJsonClaimCheckSerializer());
```

<!-- endsnippet -->
