重複する処理を共通化したプログラム
前回までで、MVCモデルによる登録、更新、削除処理の作成が完了しました。
ただし、前回までのプログラムでは、更新処理と削除処理で作成した DataFind()メソッドが全く同じものであり、この処理に問題があった場合は、両方とも修正しなければなりません。
今回は、同じ処理を共通化すると共に、現在 Program.cs に処理ごとに登録しているサービスを拡張メソッドを使用して、ひとつのサービスとしてまとめます。
共通で使用するインターフェイスと実装クラスを作成する
まず、DataFind()メソッドを共通化するために、新規にインターフェイス(ICommonService)と実装クラス(CommonImpl)を作成します。
ここに、更新処理と削除処理で使用している DataFind()メソッドを移動させます。
1 2 3 4 5 6 7 8 9 |
using MvcApp3.Models.ViewModel; namespace MvcApp3.Services { public interface ICommonService { public Task<EmpViewModel> DataFind(string id); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using MvcApp3.Data; using MvcApp3.Models.ViewModel; namespace MvcApp3.Services { public class CommonImpl : ICommonService { private readonly MvcAppDbContext _context; public CommonImpl(MvcAppDbContext context) { _context = context; } public async Task<EmpViewModel> DataFind(string id) { var emp = await _context.Emps.FindAsync(Int32.Parse(id)); EmpViewModel vm = new EmpViewModel() { Id = emp.Id, Name = emp.Name, ZipCode = emp.ZipCode, Address = emp.Address, Birthday = emp.Birthday, Email = emp.Email }; return vm; } } } |
更新処理と削除処理からDataFind()メソッドを削除する
共通処理用のインターフェイスと実装クラスを作成したら、更新処理と削除処理にある DataFind()メソッドを削除します。
以下のコードは、DataFind()メソッドを削除後の内容です。
1 2 3 4 5 6 7 8 9 |
using MvcApp3.Models.ViewModel; namespace MvcApp3.Services { public interface IUpdateService { public Task<EmpViewModel> Update(EmpViewModel vm); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using MvcApp3.Data; using MvcApp3.Models.Entity; using MvcApp3.Models.ViewModel; namespace MvcApp3.Services { public class UpdateImpl : IUpdateService { private readonly MvcAppDbContext _context; public UpdateImpl(MvcAppDbContext context) { _context = context; } public async Task<EmpViewModel> Update(EmpViewModel vm) { var emp = new Emp() { Id = vm.Id, Name = vm.Name, ZipCode = vm.ZipCode, Address = vm.Address, Birthday = (DateOnly)vm.Birthday, Email = vm.Email }; _context.Update(emp); await _context.SaveChangesAsync(); return vm; } } } |
1 2 3 4 5 6 7 8 9 |
using MvcApp3.Models.ViewModel; namespace MvcApp3.Services { public interface IDeleteService { public Task<EmpViewModel> Delete(EmpViewModel vm); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using MvcApp3.Data; using MvcApp3.Models.Entity; using MvcApp3.Models.ViewModel; namespace MvcApp3.Services { public class DeleteImpl : IDeleteService { private readonly MvcAppDbContext _context; public DeleteImpl(MvcAppDbContext context) { _context = context; } public async Task<EmpViewModel> Delete(EmpViewModel vm) { var emp = new Emp() { Id = vm.Id, Name = vm.Name, ZipCode = vm.ZipCode, Address = vm.Address, Birthday = (DateOnly)vm.Birthday, Email = vm.Email }; _context.Remove(emp); await _context.SaveChangesAsync(); return vm; } } } |
これで同じ処理の共通化は完了です。
サービスを登録するクラスを作成する
次に拡張メソッドを使ったサービスのグループ化を行います。
現在、Program.cs に個別で登録しているサービスをまとめるためのクラスを新しく作成します。
配置場所はどこでも良いのですが、今回は Serivcesフォルダー配下に作成します。
このクラスに拡張メソッドを作成して、Program.cs に登録していたサービスを移動します。
今後、新しくサービスを追加する場合は、この拡張メソッドに追記していきます。
拡張メソッドの作成方法に関しては、こちらの記事を参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
namespace MvcApp3.Services { public static class ServiceExtensions { public static void AddServices(this IServiceCollection services) { services.AddScoped<ICommonService, CommonImpl>(); services.AddScoped<IEmpsService, EmpsImpl>(); services.AddScoped<IInsertService, InsertImpl>(); services.AddScoped<IUpdateService, UpdateImpl>(); services.AddScoped<IDeleteService, DeleteImpl>(); } } } |
Program.csにグループ化したサービスを登録する
Program.cs から個別に登録していたサービスを削除して、新しく作成したサービスを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using Microsoft.EntityFrameworkCore; using MvcApp3.Data; using MvcApp3.Extensions; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); builder.Services.AddDbContext<MvcAppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MvcAppDb")) ); builder.Services.AddServices(); var app = builder.Build(); ~ 以下略 ~ |
これで、今後サービスが追加されても、Program.cs にサービスを追加する必要はなくなります。