Visual Studioを使用したC#オニオンアーキテクチャ実装チュートリアル
オニオンアーキテクチャは、依存関係が常に内側(ドメイン層)に向かう設計パターンです。
この設計手法により、ビジネスロジック(ドメイン)が外部の技術的変更(データアクセス、UIなど)の影響を受けにくくなり、保守性・拡張性が向上します。
以下のサンプルでは、シンプルな「Product(商品)」エンティティを例に、商品の追加と取得を実装します。
目次
Visual Studioでのプロジェクト作成手順
1. Visual Studioの起動と新規プロジェクトの作成
- Visual Studioを起動
インストール済みのVisual Studio(Community Editionなど)を起動します。 - 新規プロジェクトの作成
- メニューから「ファイル」→「新規作成」→「プロジェクト」を選択します。
- 「新しいプロジェクト」ダイアログが表示されたら、テンプレート一覧から「Console App (.NET Core)」または「Console App (.NET Framework)」を選択し、次へ をクリックします。
- プロジェクト名に「OnionArchitectureSample」と入力し、保存場所とソリューション名も同様に設定後、「作成」ボタンをクリックします。
フォルダ・ファイル構成の作成
Visual Studioのソリューションエクスプローラーを利用して、プロジェクト内に各層ごとのフォルダとファイルを作成します。
1. プロジェクト内フォルダーの作成
- フォルダー作成手順:
- ソリューションエクスプローラーでプロジェクト名を右クリックし、「追加」→「新しいフォルダー」を選択します。
- 以下のフォルダーを作成します:
- Domain
- Application
- Infrastructure
2. ドメイン層の実装
a. EntitiesフォルダーとProduct.csの作成
- Entitiesフォルダーの作成:
- 「Domain」フォルダーを右クリックして「追加」→「新しいフォルダー」を選択し、「Entities」と命名します。
- Product.csの作成:
- 「Entities」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
- 「C#クラス」を選択し、ファイル名を「Product.cs」にして追加します。
- 以下のコードを貼り付けます。
namespace OnionArchitectureSample.Domain.Entities
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
b. InterfacesフォルダーとIProductRepository.csの作成
- Interfacesフォルダーの作成:
- 「Domain」フォルダー内に新しいフォルダーを追加し、「Interfaces」と命名します。
- IProductRepository.csの作成:
- 「Interfaces」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
- ファイル名を「IProductRepository.cs」にして追加し、以下のコードを貼り付けます。
using System.Collections.Generic;
using OnionArchitectureSample.Domain.Entities;
namespace OnionArchitectureSample.Domain.Interfaces
{
public interface IProductRepository
{
IEnumerable<Product> GetAll();
void Add(Product product);
}
}
3. アプリケーション層の実装
a. ServicesフォルダーとProductService.csの作成
- Servicesフォルダーの作成:
- 「Application」フォルダーを右クリックし、「追加」→「新しいフォルダー」を選択し、「Services」と命名します。
- ProductService.csの作成:
- 「Services」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
- ファイル名を「ProductService.cs」にして追加し、以下のコードを貼り付けます。
using System.Collections.Generic;
using OnionArchitectureSample.Domain.Entities;
using OnionArchitectureSample.Domain.Interfaces;
namespace OnionArchitectureSample.Application.Services
{
public class ProductService
{
private readonly IProductRepository _productRepository;
public ProductService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
public IEnumerable<Product> GetProducts()
{
return _productRepository.GetAll();
}
public void CreateProduct(Product product)
{
_productRepository.Add(product);
}
}
}
4. インフラストラクチャ層の実装
a. RepositoriesフォルダーとInMemoryProductRepository.csの作成
- Repositoriesフォルダーの作成:
- 「Infrastructure」フォルダーを右クリックし、「追加」→「新しいフォルダー」を選択し、「Repositories」と命名します。
- InMemoryProductRepository.csの作成:
- 「Repositories」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
- ファイル名を「InMemoryProductRepository.cs」にして追加し、以下のコードを貼り付けます。
using System.Collections.Generic;
using OnionArchitectureSample.Domain.Entities;
using OnionArchitectureSample.Domain.Interfaces;
namespace OnionArchitectureSample.Infrastructure.Repositories
{
public class InMemoryProductRepository : IProductRepository
{
private readonly List<Product> _products = new List<Product>();
public IEnumerable<Product> GetAll()
{
return _products;
}
public void Add(Product product)
{
product.Id = _products.Count + 1;
_products.Add(product);
}
}
}
5. プレゼンテーション層の実装
a. Program.csの編集
- プロジェクトのルートにある「Program.cs」を開き、既存のコードを以下の内容に置き換えます。
using System;
using OnionArchitectureSample.Application.Services;
using OnionArchitectureSample.Domain.Entities;
using OnionArchitectureSample.Infrastructure.Repositories;
class Program
{
static void Main()
{
// インフラ層のリポジトリ実装を生成
var productRepository = new InMemoryProductRepository();
// アプリケーション層のサービスを生成
var productService = new ProductService(productRepository);
// 新しい商品を作成して追加
var newProduct = new Product { Name = "Sample Product", Price = 100.0m };
productService.CreateProduct(newProduct);
// 商品一覧を取得して表示
var products = productService.GetProducts();
foreach (var product in products)
{
Console.WriteLine($"Product Id: {product.Id}, Name: {product.Name}, Price: {product.Price}");
}
// コンソールウィンドウが閉じないように待機
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
プロジェクトのビルドと実行
1. ビルド
- Visual Studio上部のメニューから「ビルド」→「ソリューションのビルド」を選択し、エラーが出ないか確認します。
2. 実行
- ビルドが成功したら、ツールバーの「デバッグ開始」ボタン(緑色の再生ボタン)をクリックするか、
F5
キーを押してアプリケーションを実行します。 - コンソールウィンドウに「Sample Product」の情報が表示され、商品のID、名前、価格が確認できるはずです。
追加のヒント
- ソリューションエクスプローラー:
作成したフォルダーやファイルを視覚的に管理できます。プロジェクトが大規模になる場合は、各層ごとに整理することで保守性が向上します。 - 依存性注入(DI)の導入:
このサンプルではシンプルな実装としていますが、実際のプロジェクトではDIコンテナ(例:Microsoft.Extensions.DependencyInjectionなど)を導入すると、各層の依存性管理が容易になります。 - ユニットテストの実装:
オニオンアーキテクチャはテストがしやすい設計です。別途テストプロジェクトを作成し、各層ごとのテストを実装することで、品質向上を図ると良いでしょう。
このチュートリアルを通じて、Visual Studioを使用したC#でのオニオンアーキテクチャ実装の流れを理解できるでしょう。
各層の役割や依存関係の管理、さらにVisual Studioの操作に慣れることで、実際のプロジェクトへの応用がしやすくなります。
ディスカッション
コメント一覧
まだ、コメントがありません