﻿# Publish and Handle an Event


Event messages need to either implement `IEvent` or match a custom `DefiningEventsAs` convention. See the [message design documentation](/nservicebus/messaging/messages-events-commands.md) for more details.

## Handling an event

In order to handle an event, implement the `IHandleMessages<T>` interface in any [handler](/nservicebus/handlers/index.md) or [saga](/nservicebus/sagas/index.md) class, where `T` is the specific event type.

## Publishing an event

Call the `Publish` method to publish an event.

There are a few common scenarios for publishing events. Events might be published:

- from a **handler**, when processing another message.

<!-- snippet: publishFromHandler -->

```cs
public class CreateUserHandler : IHandleMessages<CreateUserCommand>
{
    public async Task Handle(CreateUserCommand message, IMessageHandlerContext context)
    {
        var userCreatedEvent = new UserCreatedEvent
        {
            Name = message.Name
        };

        await context.Publish(userCreatedEvent);
    }
}
```

<!-- endsnippet -->

- from a **saga handler**, when processing another message.

<!-- snippet: publishFromSaga -->

```cs
public class CreateUserSaga : Saga<CreateUserSaga.SagaData>, IHandleMessages<CreateUserCommand>
{
    public async Task Handle(CreateUserCommand message, IMessageHandlerContext context)
    {
        var userCreatedEvent = new UserCreatedEvent
        {
            Name = message.Name
        };

        await context.Publish(userCreatedEvent);
    }
```

<!-- endsnippet -->

- at endpoint startup

<!-- snippet: publishAtStartup -->

```cs
// Other config
var builder = Host.CreateApplicationBuilder();
builder.Services.AddNServiceBusEndpoint(endpointConfiguration);
var host = builder.Build();
await host.StartAsync();
var messageSession = host.Services.GetRequiredService<IMessageSession>();
await messageSession.Publish(new MyEvent());
```

<!-- endsnippet -->

## Composing events

In order to support advanced composition scenarios, events can be defined as interfaces. See the [Messages as Interfaces](/nservicebus/messaging/messages-as-interfaces.md) for more details.
