asp.net coreはDIが使えるが、DbContextをDIさせるのに少々手間取ったので備忘録としてメモ。
何に戸惑ったのかというと、DbContextインスタンスを作成するときに、appsettings.jsonから接続文字列を取り出して、それを接続に使う方法。
ドキュメントをちゃんと読んでいれば直ぐ分かるのだけどねぇ・・・
で、結局以下のような感じで接続文字列を取得して、インスタンス作成が可能。(UseSqlServerの部分は実際のDBMS用ドライバに合わせてねっ)
using Microsoft.EntityFrameworkCore;
using XXXContextNamespace;
・・・
var builder = WebApplication.CreateBuilder(args);
・・・
builder.Services.AddDbContext<XXXContext>(opt=>
opt.UseSqlServer(builder.Configuration.GetConnectionString("XXXConnection")));
こうしておくと、例えばwebappならば、PageModelのコンストラクタから、このDbContextのインスタンスを取得することができる。
using XXXContextNamespace;
・・・
private readonly ILogger<IndexModel> _logger;
private readonly XXXContext _ctx;
public class IndexModel : PageModel {
public IndexModel(ILogger<IndexModel> logger, XXXContext ctx) {
_logger = logger;
_ctx = ctx;
・・・
}
}
Blazor Serverなら、こんな感じ
@page "/"
@using XXXContextNamespace
@inject XXXContext XXXCtx
・・・
XXX:<select>
@if (XXXMasters != null) {
foreach(var itm in XXXMasters) {
<option value="@itm.Key">@itm.Name</option>
}
</select>
・・・
@code {
protected List<XXXMaster> XXXMasters = null!;
・・・
protected async Task OnInitializeAsync() {
var q = XXXCtx.XXXMaster・・・;
XXXMasters = await q.ToListAsync();
}
}