# Changing Service Behavior

A service is a class with reusable logic that will be leveraged across the system, for example, in multiple pipelines. Changing the behavior of a service means applying this behavior platform-wide.

For example, customizing the `ITaxService` will change how taxes are calculated for shipments, payments, products, and order lines.&#x20;

All services are registered in the IoC container, so it is easy to overwrite them.

## Implementing a Service

Once the service to change is identified, create a new class and either implement the interface or inherit from the existing implementation.

* Implementing the interface requires writing a full implementation.
* Inheriting an existing implementation allows for overriding only parts of an existing implementation, where applicable.

### Implementing the Interface

```csharp
 public class CustomXService: IXService
    {
        public Task<XReturn> XMethod(.., CancellationToken token)
        {
            // Custom implementation
            return xReturn;
        }
    }
```

### Inheriting an Existing Implementation

If `XService` has multiple methods, and only one needs to be overridden, it can be done by inheriting the default implementation and selecting which methods to override.&#x20;

{% hint style="info" %}
It is possible to call the base method from the custom code using&#x20;

`"base.Xmethod(..);"`
{% endhint %}

```csharp
public class CustomXService: XService
    {
        public override Task<XReturn> XMethod(.., CancellationToken token)
        {
            // Custom implementation
            // Possible to call base.Xmethod(.., token) from custom code.
            return xReturn;
        }
    }
```

### Registering the Custom Service Implementation

```csharp
builder.Services.AddUcommerce(builder.Configuration)
    // ... register other Ucommerce components first
    .Build();
builder.Services.AddUnique<IXService, CustomXService>();
```
