C# MVCの構成を押さえる

システム開発
スポンサーリンク
スポンサーリンク

― Service と DataManager まで含めた実践設計 ―

ASP.NET MVC で開発を続けていると、「Controller が肥大化してきた」「ビジネスロジックやデータ取得処理の置き場に迷う」と感じる場面は少なくありません。

特に、10年前後の経験を積んだエンジニアほど、長期運用・改修を見据えた設計を意識する機会が増えてきます。

本記事では、MVC の基本構成をおさらいしたうえで、Service 層と DataManager 層を加えた実践的な設計構造を整理します。

既存システムのリファクタリングにも応用できる内容です。

C# MVCの基本構造 ― Model / View / Controller

この章では、MVC の基本的な役割分担を整理します。設計を見直す際の前提となる考え方です。

  • Model:データ構造、ドメインルール、状態を表す
  • View:ユーザーに返却する UI
  • Controller:HTTP リクエストの受け口と処理の振り分け

重要なのは、Controller に処理を集めすぎないことです。Controller はあくまで調整役とし、業務判断やデータ操作は別レイヤーに委譲します。

MVCに加えるべき実践レイヤー ― Service と DataManager

MVC だけでもアプリケーションは構築できますが、中〜大規模・長期運用を考えると責務が曖昧になりがちです。この章では、実務でよく追加される Service 層と DataManager 層を整理します。

Service(サービス層)の役割

Service 層は、ビジネスロジックを集約するための層です。

  • 業務ルール・判定ロジックの実装
  • 複数処理をまとめたフロー制御
  • DTO への変換や整形
  • トランザクション境界の管理

Controller が直接ロジックを持たないことで、テスト容易性や保守性が向上します。

DataManager(データ管理層)の役割

DataManager は、データアクセスを一元化するための層です。

  • DB アクセス(EF Core / Dapper / ADO.NET など)
  • 外部 API 呼び出し
  • キャッシュとの切り替え
  • データ取得・保存ロジックの共通化

Service や Controller に SQL が漏れない構造を作ることで、変更に強い設計になります。

MVC+Service+DataManager の標準的な構成例

この章では、ASP.NET Core MVC を例にした一般的な構成を示します。考え方は .NET Framework MVC でも同様です。

Controllers/
    ProductController.cs

Models/
    Product.cs
    ProductDto.cs

Services/
    IProductService.cs
    ProductService.cs

Data/
    IProductDataManager.cs
    ProductDataManager.cs

Views/
    Product/Index.cshtml
    Product/Detail.cshtml

各レイヤーの依存関係

レイヤーを分割した場合の依存関係は次のとおりです。

Controller → Service → DataManager → DbContext / API
                       ↓
                    Model(Entity / DTO)

依存方向を一方向に保つことで、テスト容易性と変更耐性が向上します。

具体的なサンプルで理解する構成

ここでは「商品一覧を取得する」処理を例に、各レイヤーの役割を確認します。

Controller(最小限の制御のみ)

C# example

public class ProductController : Controller
{
    private readonly IProductService _service;

    public ProductController(IProductService service)
    {
        _service = service;
    }

    public IActionResult Index()
    {
        var products = _service.GetProductList();
        return View(products);
    }
}

Service(業務ロジックを担当)

C# example

public class ProductService : IProductService
{
    private readonly IProductDataManager _dataManager;

    public ProductService(IProductDataManager dataManager)
    {
        _dataManager = dataManager;
    }

    public IEnumerable<ProductDto> GetProductList()
    {
        var entities = _dataManager.FetchProducts();
        return entities.Select(p => new ProductDto
        {
            Id = p.Id,
            Name = p.Name,
            Price = p.Price
        });
    }
}

DataManager(データ取得を担当)

C# example

public class ProductDataManager : IProductDataManager
{
    private readonly AppDbContext _context;

    public ProductDataManager(AppDbContext context)
    {
        _context = context;
    }

    public IEnumerable<Product> FetchProducts()
    {
        return _context.Products.ToList();
    }
}

この構成により、Controller・Service・DataManager の責務が明確になります。

まとめ:Service と DataManager を加えると MVC は実戦向きになる

ASP.NET MVC はシンプルな構造ですが、Service と DataManager を加えることで、長期運用に耐える設計になります。

  • Controller の肥大化を防げる
  • テストコードを書きやすい
  • 仕様変更時の影響範囲を限定できる

まずは既存プロジェクトで、Controller からロジックを切り出すところから始めてみてください。

システム開発
スポンサーリンク
シェアする
tobotoboをフォローする

コメント

タイトルとURLをコピーしました