Visual Studioを使用したC#オニオンアーキテクチャ実装チュートリアル

オニオンアーキテクチャは、依存関係が常に内側(ドメイン層)に向かう設計パターンです。
この設計手法により、ビジネスロジック(ドメイン)が外部の技術的変更(データアクセス、UIなど)の影響を受けにくくなり、保守性・拡張性が向上します。
以下のサンプルでは、シンプルな「Product(商品)」エンティティを例に、商品の追加と取得を実装します。


Visual Studioでのプロジェクト作成手順

1. Visual Studioの起動と新規プロジェクトの作成

  • Visual Studioを起動
    インストール済みのVisual Studio(Community Editionなど)を起動します。
  • 新規プロジェクトの作成
  1. メニューから「ファイル」→「新規作成」→「プロジェクト」を選択します。
  2. 新しいプロジェクト」ダイアログが表示されたら、テンプレート一覧から「Console App (.NET Core)」または「Console App (.NET Framework)」を選択し、次へ をクリックします。
  3. プロジェクト名に「OnionArchitectureSample」と入力し、保存場所とソリューション名も同様に設定後、「作成」ボタンをクリックします。

フォルダ・ファイル構成の作成

Visual Studioのソリューションエクスプローラーを利用して、プロジェクト内に各層ごとのフォルダとファイルを作成します。

1. プロジェクト内フォルダーの作成

  • フォルダー作成手順:
  1. ソリューションエクスプローラーでプロジェクト名を右クリックし、「追加」→「新しいフォルダー」を選択します。
  2. 以下のフォルダーを作成します:
    • Domain
    • Application
    • Infrastructure

2. ドメイン層の実装

a. EntitiesフォルダーとProduct.csの作成

  • Entitiesフォルダーの作成:
  1. 「Domain」フォルダーを右クリックして「追加」→「新しいフォルダー」を選択し、「Entities」と命名します。
  • Product.csの作成:
  1. 「Entities」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
  2. 「C#クラス」を選択し、ファイル名を「Product.cs」にして追加します。
  3. 以下のコードを貼り付けます。
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フォルダーの作成:
  1. 「Domain」フォルダー内に新しいフォルダーを追加し、「Interfaces」と命名します。
  • IProductRepository.csの作成:
  1. 「Interfaces」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
  2. ファイル名を「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フォルダーの作成:
  1. 「Application」フォルダーを右クリックし、「追加」→「新しいフォルダー」を選択し、「Services」と命名します。
  • ProductService.csの作成:
  1. 「Services」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
  2. ファイル名を「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フォルダーの作成:
  1. 「Infrastructure」フォルダーを右クリックし、「追加」→「新しいフォルダー」を選択し、「Repositories」と命名します。
  • InMemoryProductRepository.csの作成:
  1. 「Repositories」フォルダーを右クリックし、「追加」→「新しい項目」を選択。
  2. ファイル名を「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の操作に慣れることで、実際のプロジェクトへの応用がしやすくなります。

C#

Posted by hidepon