今回は ASP.NET Core MVC の Controller 内で実際に使える形 にし、
Payment の生成処理をサービスメソッドに分離して再利用可能にします。
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
public class Payment
{
public int PaymentId { get; set; } // DB側で自動生成
public DateTime Posted { get; set; }
public bool InOut { get; set; }
public int? SubjectNameId { get; set; }
public string ItemName { get; set; }
public string PaymentName { get; set; }
public int? PaymentTypeId { get; set; }
public int? PaymentMethodId { get; set; }
public int? IncomeCategoryId { get; set; }
public int? IncomeTypeId { get; set; }
public decimal Amount { get; set; }
}
public interface IPaymentService
{
List<Payment> GeneratePayments();
}
public class PaymentService : IPaymentService
{
private static int? GetId(Dictionary<string, int> dict, string key)
{
return dict.TryGetValue(key, out var value) && value != 0 ? value : (int?)null;
}
public List<Payment> GeneratePayments()
{
int thisYear = DateTime.Now.Year;
int previousMonth = DateTime.Now.Month - 1;
if (previousMonth == 0) { previousMonth = 12; thisYear--; }
// 各Id辞書
var subjectNameDict = new Dictionary<string, int> { { "家計", 1 }, { "事業", 2 } };
var paymentTypeDict = new Dictionary<string, int> { { "予算", 10 }, { "支出", 20 } };
var paymentMethodDict = new Dictionary<string, int> { { "現金", 100 }, { "銀行振込", 200 } };
var incomeCategoryDict = new Dictionary<string, int> { { "給与", 300 }, { "副業", 400 } };
var incomeTypeDict = new Dictionary<string, int> { { "定期", 500 }, { "臨時", 600 } };
// 複数のPaymentデータ定義
var paymentData = new[]
{
new { SubjectKey = "家計", TypeKey = "予算", MethodKey = "現金", CategoryKey = "給与", IncomeTypeKey = "定期", Amount = 268000m, ItemName = "今月予算" },
new { SubjectKey = "事業", TypeKey = "支出", MethodKey = "銀行振込", CategoryKey = "副業", IncomeTypeKey = "臨時", Amount = 150000m, ItemName = "事業支出" }
};
var payments = new List<Payment>();
foreach (var data in paymentData)
{
payments.Add(new Payment
{
Posted = new DateTime(thisYear, previousMonth, 1),
InOut = true,
SubjectNameId = GetId(subjectNameDict, data.SubjectKey),
ItemName = data.ItemName,
PaymentName = null,
PaymentTypeId = GetId(paymentTypeDict, data.TypeKey),
PaymentMethodId = GetId(paymentMethodDict, data.MethodKey),
IncomeCategoryId = GetId(incomeCategoryDict, data.CategoryKey),
IncomeTypeId = GetId(incomeTypeDict, data.IncomeTypeKey),
Amount = data.Amount
});
}
return payments;
}
}
public class PaymentsController : Controller
{
private readonly IPaymentService _paymentService;
public PaymentsController(IPaymentService paymentService)
{
_paymentService = paymentService;
}
public IActionResult Index()
{
// サービスからPaymentリストを取得
var payments = _paymentService.GeneratePayments();
// Viewに渡す
return View(payments);
}
}
改良点
MVC構造対応
PaymentService に生成処理を分離し、PaymentsController から呼び出す形に変更。
依存性注入(DI)対応
IPaymentService インターフェースを用意し、ASP.NET Core の DI コンテナに登録すればテストや拡張が容易。
再利用性向上
GeneratePayments() メソッドは他のコントローラーやバッチ処理でも利用可能。
View連携
コントローラーの Index アクションで生成した payments をビューに渡す。
この形なら、実際の ASP.NET Core MVC プロジェクトに組み込んで動かせます。
次はこの PaymentService を DBから辞書データを取得する形 に変えることもできますが、それも作りますか?
そうすれば完全に動的な ID 取得になります。
Powered by Froala Editor