ذخیره سازی تنظیمات برنامههای ASP.NET Core در بانک اطلاعاتی به کمک Entity Framework Core
نویسنده: وحید نصیری
تاریخ: ۱۳۹۸/۰۱/۱۳ ۱۸:۴۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace DbConfig.Web.DomainClasses
{
public class ConfigurationValue
{
public int Id { get; set; }
public string Key { get; set; }
public string Value { get; set; }
}
} public class MyAppContext : DbContext, IUnitOfWork
{
public MyAppContext(DbContextOptions options) : base(options)
{ }
public virtual DbSet<ConfigurationValue> Configurations { set; get; } protected override void OnModelCreating(ModelBuilder builder)
{
// it should be placed here, otherwise it will rewrite the following settings!
base.OnModelCreating(builder);
// Custom application mappings
builder.Entity<ConfigurationValue>(entity =>
{
entity.Property(e => e.Key).HasMaxLength(450).IsRequired();
entity.HasIndex(e => e.Key).IsUnique();
entity.Property(e => e.Value).IsRequired();
entity.HasData(new ConfigurationValue
{
Id = 1,
Key = "key-1",
Value = "value_from_ef_1"
});
entity.HasData(new ConfigurationValue
{
Id = 2,
Key = "key-2",
Value = "value_from_ef_2"
});
});
} public class EFConfigurationSource : IConfigurationSource
{
private readonly IServiceProvider _serviceProvider;
public EFConfigurationSource(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new EFConfigurationProvider(_serviceProvider);
}
} public class EFConfigurationProvider : ConfigurationProvider
{
private readonly IServiceProvider _serviceProvider;
public EFConfigurationProvider(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
ensureDatabaseIsCreated();
}
public override void Load()
{
using (var scope = _serviceProvider.CreateScope())
{
var uow = scope.ServiceProvider.GetRequiredService<IUnitOfWork>();
this.Data?.Clear();
this.Data = uow.Set<ConfigurationValue>()
.AsNoTracking()
.ToList()
.ToDictionary(c => c.Key, c => c.Value);
}
}
private void ensureDatabaseIsCreated()
{
using (var scope = _serviceProvider.CreateScope())
{
var uow = scope.ServiceProvider.GetRequiredService<IUnitOfWork>();
uow.Migrate();
}
}
} public static class EFExtensions
{
public static IConfigurationBuilder AddEFConfig(this IConfigurationBuilder builder,
IServiceProvider serviceProvider)
{
return builder.Add(new EFConfigurationSource(serviceProvider));
}
} namespace DbConfig.Web
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IUnitOfWork, MyAppContext>();
services.AddScoped<IConfigurationValuesService, ConfigurationValuesService>();
var connectionString = Configuration.GetConnectionString("SqlServerConnection")
.Replace("|DataDirectory|", Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "app_data"));
services.AddDbContext<MyAppContext>(options =>
{
options.UseSqlServer(
connectionString,
dbOptions =>
{
var minutes = (int)TimeSpan.FromMinutes(3).TotalSeconds;
dbOptions.CommandTimeout(minutes);
dbOptions.EnableRetryOnFailure();
});
});
var serviceProvider = services.BuildServiceProvider();
var configuration = new ConfigurationBuilder()
.AddConfiguration(Configuration) // Adds all of the existing configurations
.AddEFConfig(serviceProvider)
.Build();
services.AddSingleton<IConfigurationRoot>(sp => configuration); // Replace
services.AddSingleton<IConfiguration>(sp => configuration); // Replace namespace DbConfig.Web.Controllers
{
public class HomeController : Controller
{
private readonly IConfiguration _configuration;
public HomeController(IConfiguration configuration)
{
_configuration = configuration;
}
public IActionResult Index()
{
return Json(
new
{
key1 = _configuration["key-1"],
key2 = _configuration["key-2"]
});
}
public class ConfigurationValuesService : IConfigurationValuesService
{
private readonly IConfiguration _configuration;
public ConfigurationValuesService(IConfiguration configuration)
{
_configuration = configuration;
}
private void reloadEFConfigurationProvider()
{
((IConfigurationRoot)_configuration).Reload();
}