---
lang: ja-jp
breaks: true
---
# `MagicOnion` `Unary` `Hello World` 2022-02-06
## 環境
* `ASP.NET Core`
* `net6.0`
* `Visual Studio 2022`
## 参考
Magic Onion Quick Start
https://github.com/Cysharp/MagicOnion/blob/master/README.md#quick-start
## 共通クラスライブラリ
#### `クラスライブラリ` テンプレートを使用して、共有クラスライブラリプロジェクトを作成

#### プロジェクトファイルを変更して、必要なパッケージ参照を追加
```xml=
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MagicOnion" Version="4.4.0" />
<PackageReference Include="MagicOnion.Abstractions" Version="4.4.0" />
<PackageReference Include="MagicOnion.Shared" Version="4.4.0" />
<PackageReference Include="MessagePack" Version="2.3.85" />
<PackageReference Include="MessagePack.Annotations" Version="2.3.85" />
</ItemGroup>
</Project>
```
#### `IMyFirstService.cs` インターフェイスを作成
```csharp=
using MagicOnion;
namespace Shared
{
// Defines .NET interface as a Server/Client IDL.
// The interface is shared between server and client.
public interface IMyFirstService : IService<IMyFirstService>
{
// The return type must be `UnaryResult<T>`.
UnaryResult<int> SumAsync(int x, int y);
}
}
```
## Webサービス側
#### `ASP.NET Core gRPCサービス`テンプレートを使用してプロジェクトを作成

#### `Protos`、`Services` フォルダを削除

#### プロジェクトファイルを変更して、必要なパッケージ参照を追加
```xml=
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MagicOnion" Version="4.4.0" />
<PackageReference Include="MagicOnion.Abstractions" Version="4.4.0" />
<PackageReference Include="MagicOnion.Server" Version="4.4.0" />
<PackageReference Include="MagicOnion.Shared" Version="4.4.0" />
<PackageReference Include="MessagePack" Version="2.3.85" />
<PackageReference Include="MessagePack.Annotations" Version="2.3.85" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.0.64">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.40.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
</Project>
```
#### `Program.cs` に `MagicOnion` で必要な処理を追加
```csharp=
var builder = WebApplication.CreateBuilder(args);
// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
// Add services to the container.
builder.Services.AddGrpc();
builder.Services.AddMagicOnion(); // ※ここを追加。
var app = builder.Build();
// Configure the HTTP request pipeline.
app.MapMagicOnionService(); // ※ここを削除/追加。
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
app.Run();
```
#### `MyFirstService.cs` ※サービスを実装
```csharp=
using MagicOnion;
using MagicOnion.Server;
using Shared;
namespace gRPCService
{
// Implements RPC service in the server project.
// The implementation class must inherit `ServiceBase<IMyFirstService>` and `IMyFirstService`
public class MyFirstService :
ServiceBase<
IMyFirstService
>,
IMyFirstService
{
// `UnaryResult<T>` allows the method to be treated as `async` method.
public async UnaryResult<int> SumAsync(int x, int y)
{
Console.WriteLine($"Received:{x}, {y}");
return x + y;
}
}
}
```
## コンソールクライアント
#### `コンソール アプリ` テンプレートを使用してソリューション/プロジェクトを作成

#### プロジェクトファイルを変更して、必要なパッケージ参照を追加
```xml=
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Grpc.Net.Client" Version="2.42.0" />
<PackageReference Include="MagicOnion.Client" Version="4.4.0" />
<PackageReference Include="MagicOnion.Shared" Version="4.4.0" />
<PackageReference Include="MessagePack" Version="2.3.85" />
<PackageReference Include="MessagePack.Annotations" Version="2.3.85" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
</ItemGroup>
</Project>
```
#### `Program.cs` にクライアントの処理を記述
```csharp=
// See https://aka.ms/new-console-template for more information
using Grpc.Net.Client;
using MagicOnion.Client;
using Shared;
Console.WriteLine("Hello, World!");
// Connect to the server using gRPC channel.
var channel = GrpcChannel.ForAddress("https://localhost:7069");
// NOTE: If your project targets non-.NET Standard 2.1, use `Grpc.Core.Channel` class instead.
// var channel = new Channel("localhost", 5001, new SslCredentials());
// Create a proxy to call the server transparently.
var client = MagicOnionClient.Create<IMyFirstService>(channel);
// Call the server-side method using the proxy.
var result = await client.SumAsync(123, 456);
Console.WriteLine($"Result: {result}");
```
## 動作確認

###### tags: `MagicOnion` `ASP.NET Core` `net6.0` `Unary` `Hello World` `Visual Studio 2022`