

 AWS SDK for .NET V3 がメンテナンスモードになりました。

[AWS SDK for .NET V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html) に移行することをお勧めします。移行方法の詳細と情報については、[メンテナンスモードのお知らせ](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS Message Processing Framework for .NET を使用してメッセージを発行する
<a name="msg-proc-fw-publish"></a>

AWS Message Processing Framework for .NET は、1 つ以上のメッセージタイプの発行、1 つ以上のメッセージタイプの処理、または同じアプリケーションでの両方の実行をサポートしています。

次のコードは、異なる AWS サービスに異なるメッセージタイプを発行するアプリケーションの設定を示しています。

```
var builder = WebApplication.CreateBuilder(args);

// Register the AWS Message Processing Framework for .NET
builder.Services.AddAWSMessageBus(builder =>
{
    // Register that you'll send messages of type ChatMessage to an existing queue
    builder.AddSQSPublisher<ChatMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd");

    // Register that you'll publish messages of type OrderInfo to an existing SNS topic
    builder.AddSNSPublisher<OrderInfo>("arn:aws:sns:us-west-2:012345678910:MyAppProd");

    // Register that you'll publish messages of type FoodItem to an existing EventBridge bus
    builder.AddEventBridgePublisher<FoodItem>("arn:aws:events:us-west-2:012345678910:event-bus/default");
});
```

起動時にフレームワークを登録したら、汎用 `IMessagePublisher` をコードに挿入します。`PublishAsync` メソッドを呼び出して、上記で設定されたメッセージタイプを発行します。汎用パブリッシャーは、メッセージをルーティングする送信先をそのタイプに基づいて決定します。

 次の例では、ASP.NET MVC コントローラーがユーザーから `ChatMessage` メッセージと `OrderInfo` イベントの両方を受信し、それぞれ Amazon SQS と Amazon SNS に発行します。どちらのメッセージタイプも、上記で設定された汎用パブリッシャーを使用して発行できます。

```
[ApiController]
[Route("[controller]")]
public class PublisherController : ControllerBase
{
    private readonly IMessagePublisher _messagePublisher;

    public PublisherController(IMessagePublisher messagePublisher)
    {
        _messagePublisher = messagePublisher;
    }

    [HttpPost("chatmessage", Name = "Chat Message")]
    public async Task<IActionResult> PublishChatMessage([FromBody] ChatMessage message)
    {
        // Perform business and validation logic on the ChatMessage here.
        if (message == null)
        {
            return BadRequest("A chat message was not submitted. Unable to forward to the message queue.");
        }
        if (string.IsNullOrEmpty(message.MessageDescription))
        {
            return BadRequest("The MessageDescription cannot be null or empty.");
        }

        // Send the ChatMessage to SQS, using the generic publisher.
        await _messagePublisher.PublishAsync(message);

        return Ok();
    }

    [HttpPost("order", Name = "Order")]
    public async Task<IActionResult> PublishOrder([FromBody] OrderInfo message)
    {
        if (message == null)
        {
            return BadRequest("An order was not submitted.");
        }

        // Publish the OrderInfo to SNS, using the generic publisher.
        await _messagePublisher.PublishAsync(message);

        return Ok();
    }
}
```

メッセージを適切な処理ロジックにルーティングするために、フレームワークは*メッセージタイプ識別子*と呼ばれるメタデータを使用します。デフォルトでは、これはアセンブリ名を含むメッセージの .NET タイプのフルネームです。メッセージの送信と処理の両方を行う場合、メッセージオブジェクトの定義をプロジェクト間で共有すると、このメカニズムはうまく機能します。ただし、メッセージが別の名前空間で再定義されている場合、または他のフレームワークやプログラミング言語とメッセージを交換する場合は、メッセージタイプ識別子を上書きする必要がある場合があります。

```
var builder = Host.CreateDefaultBuilder(args);

builder.ConfigureServices(services =>
{
    // Register the AWS Message Processing Framework for .NET
    services.AddAWSMessageBus(builder =>
    {
        // Register that you'll publish messages of type GreetingMessage to an existing queue
        builder.AddSQSPublisher<GreetingMessage>("https://sqs.us-west-2.amazonaws.com/012345678910/MyAppProd", "greetingMessage");
    });
});
```

## サービス固有のパブリッシャー
<a name="service-specific-publishers"></a>

上記の例では、汎用 `IMessagePublisher` を使用しています。これは、設定されたメッセージタイプに基づいて、サポートされている任意の AWS サービスに発行できます。このフレームワークは、Amazon SQS、Amazon SNS、および Amazon EventBridge のサービス固有のパブリッシャーも提供します。これらの固有パブリッシャーは、そのサービスにのみ適用され、タイプ `ISQSPublisher`、`ISNSPublisher`、`IEventBridgePublisher` を使用して挿入できるオプションを公開します。

例えば、SQS FIFO キューにメッセージを送信する場合は、適切な[メッセージグループ ID](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-key-terms.html) を設定する必要があります。次のコードは、`ChatMessage` の例を再び示していますが、今度は `ISQSPublisher` を使用して SQS 固有のオプションを設定しています。

```
public class PublisherController : ControllerBase
{
    private readonly ISQSPublisher _sqsPublisher;

    public PublisherController(ISQSPublisher sqsPublisher)
    {
        _sqsPublisher = sqsPublisher;
    }

    [HttpPost("chatmessage", Name = "Chat Message")]
    public async Task<IActionResult> PublishChatMessage([FromBody] ChatMessage message)
    {
        // Perform business and validation logic on the ChatMessage here
        if (message == null)
        {
            return BadRequest("A chat message was not submitted. Unable to forward to the message queue.");
        }
        if (string.IsNullOrEmpty(message.MessageDescription))
        {
            return BadRequest("The MessageDescription cannot be null or empty.");
        }

        // Send the ChatMessage to SQS using the injected ISQSPublisher, with SQS-specific options
        await _sqsPublisher.SendAsync(message, new SQSOptions
        {
            DelaySeconds = <delay-in-seconds>,
            MessageAttributes = <message-attributes>,
            MessageDeduplicationId = <message-deduplication-id>,
            MessageGroupId = <message-group-id>
        });

        return Ok();
    }
}
```

それぞれ `ISNSPublisher` と `IEventBridgePublisher` を使用して、SNS と EventBridge でも同じことができます。

```
await _snsPublisher.PublishAsync(message, new SNSOptions
{
    Subject = <subject>,
    MessageAttributes = <message-attributes>,
    MessageDeduplicationId = <message-deduplication-id>,
    MessageGroupId = <message-group-id>
});
```

```
await _eventBridgePublisher.PublishAsync(message, new EventBridgeOptions
{
    DetailType = <detail-type>,
    Resources = <resources>,
    Source = <source>,
    Time = <time>,
    TraceHeader = <trace-header>
});
```

デフォルトでは、特定のタイプのメッセージは、事前に設定された送信先に送信されます。ただし、メッセージ固有のパブリッシャーを使用して、1 つのメッセージの送信先を上書きできます。また、メッセージの発行に使用される基盤となる AWS SDK for .NET クライアントを上書きすることもできます。これは、送信先に応じてロールまたは認証情報を変更する必要があるマルチテナントアプリケーションで役立ちます。

```
await _sqsPublisher.SendAsync(message, new SQSOptions
{
    OverrideClient = <override IAmazonSQS client>,
    QueueUrl = <override queue URL>
});
```