«... همچنین باید درنظر داشت که استفادهی مجدد از یک Context به معنای حفظ مقادیر فیلدهای private کلاس Context سفارشی شما نیز میشود ... »
این مورد سبب میشود تا سایر پارامترهای تزریق شدهی به context، طول عمر singleton پیدا کنند؛ چون این context دیگر وهله سازی نخواهد شد و وابستگیهای آن دوباره از IoC Container سیستم، درخواست مجدد نمیشوند. به همین جهت در این حالت، تزریق سایر پارامترها را در سازندهی کلاس، ممنوع کردهاند تا این اشتباه را مرتکب نشوید.
اما ... میتوان به وابستگیهای سیستم در کلاس Context برنامه به نحو دیگری دسترسی یافت:
services.AddEntityFrameworkSqlServer();
services.AddDbContextPool<ApplicationDbContext>((serviceProvider, optionsBuilder) =>
{
optionsBuilder.UseSqlServer("...");
optionsBuilder.UseInternalServiceProvider(serviceProvider);
});
کار متد UseInternalServiceProvider افزودن serviceProvider برنامه به لیست سرویسهای داخلی EF است. از این متد عموما استفاده نمیشود، مگر اینکه بخواهید به سرویسهای برنامه درون context آن دسترسی پیدا کنید.
نکتهی مهم دیگر، ذکر صریح متد services.AddEntityFrameworkSqlServer است تا اینبار سرویسهای EF به صورت مستقیم به serviceProvider
برنامه اضافه شوند. زمانیکه UseInternalServiceProvider فراخوانی میشود، هنوز serviceProvider برنامه ساخته نشدهاست. به همین جهت نیاز است این متد را نیز دستی فراخوانی کنیم که در حالت متداول نیازی به آن نیست و توسط EF مدیریت میشود.
پس از این تنظیمات ابتدایی، اکنون داخل context برنامه به شکل زیر میتوان به سرویسهای مختلف دسترسی یافت:
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
var siteSettings = this.GetService<IOptionsSnapshot<SiteSettings>>();
// Or
var siteSettings = this.GetInfrastructure().GetRequiredService<IOptionsSnapshot<SiteSettings>>();