― 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 からロジックを切り出すところから始めてみてください。


コメント