pwa*_*was 8 c# entity-framework-core asp.net-core
考虑到我已经使用.NET Core Web应用程序配置了EF:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(...));
Run Code Online (Sandbox Code Playgroud)
我也可以下载一个包来支持例如SQLite:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlite(...));
Run Code Online (Sandbox Code Playgroud)
我们如何允许用户在应用安装上"选择"提供商?我的意思是 - 例如,在WordPress中,您可以从下拉列表中进行选择.
这在.NET Core中是否可行?我看到的唯一方法是仅重启应用程序...
下面是一个关于如何实现 aDbContextFactory
或 a 的示例DbContextProxy<T>
,它将创建正确的提供程序并返回它。
public interface IDbContextFactory
{
ApplicationContext Create();
}
public class DbContextFactory() : IDbContextFactory, IDisposable
{
private ApplicationContext context;
private bool disposing;
public DbContextFactory()
{
}
public ApplicationContext Create()
{
if(this.context==null)
{
// Get this value from some configuration
string providerType = ...;
// and the connection string for the database
string connectionString = ...;
var dbContextBuilder = new DbContextOptionsBuilder();
if(providerType == "MSSQL")
{
dbContextBuilder.UseSqlServer(connectionString);
}
else if(providerType == "Sqlite")
{
dbContextBuilder.UseSqlite(connectionString);
}
else
{
throw new InvalidOperationException("Invalid providerType");
}
this.context = new ApplicationContext(dbContextBuilder);
}
return this.context;
}
public void Dispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing){
if (disposing){
disposing?.Dispose();
}
}
}
Run Code Online (Sandbox Code Playgroud)
还要确保实现如上所示的一次性模式,以便在工厂被处置后立即处置上下文,以防止 DbContext 在内存中保留的时间超过必要的时间,并尽快释放非托管资源。
最后将工厂注册为作用域,就像上下文本身一样:
services.AddScopedd<IDbContextFactory, DbContextFactory>();
Run Code Online (Sandbox Code Playgroud)
更高级和通用/可扩展的方法是创建一个IDbContextProxy<T>
类,该类使用一些反射来获取正确的构造函数及其DbContextOptionsBuilder
。
也可以创建一个IDbContextBuilder
抽象提供者创建的。
public class SqlServerDbContextBuilder IDbContextBuilder
{
public bool CanHandle(string providerType) => providerType == "SqlServer";
public T CreateDbContext<T>(connectionString)
{
T context = ... // Create the context here
return context;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过执行以下操作来选择正确的提供者,无需硬编码if/else
或switch
阻止
// Inject "IEnumerable<IDbContextBuilder> builders" via constructor
var providerType = "SqlServer";
var builder = builders.Where(builder => builder.CanHandle(providerType)).First();
var context = builder.CreateDbContext<ApplicationContext>(connectionString);
Run Code Online (Sandbox Code Playgroud)
添加新类型的提供程序就像添加依赖项和XxxDbContextBuilder
类一样简单。
归档时间: |
|
查看次数: |
1089 次 |
最近记录: |