我正在構(gòu)建一個以asp.net為核心的web api,我想問您如何處理api中的生產(chǎn)和測試環(huán)境。目標是在IIS上發(fā)布web api,然后使用生產(chǎn)數(shù)據(jù)庫連接字符串。當我在本地啟動api時,我希望我的api能夠連接到測試數(shù)據(jù)庫,而無需更改代碼中的大量內(nèi)容。
在我的Startup.cs中,我使用實體框架如下:
services.AddDbContextFactory<ProdContext>(options =>
{
string decrypted = ConnStringSecurity.Decrypt(Configuration.GetConnectionString("ProdDBConnection"));
options.UseSqlServer(decrypted,
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: 10,
maxRetryDelay: TimeSpan.FromSeconds(5),
errorNumbersToAdd: null
);
});
});
services.AddDbContextFactory<TestContext>(options =>
{
string decrypted = ConnStringSecurity.Decrypt(Configuration.GetConnectionString("TestDBConnection"));
options.UseSqlServer(decrypted,
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: 10,
maxRetryDelay: TimeSpan.FromSeconds(5),
errorNumbersToAdd: null
);
});
});
在Configure方法中,我看到您可以區(qū)分開發(fā)和生產(chǎn),但我無法想象DBContext如何集成到if語句中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
//Use Test Db globally
app.UseDeveloperExceptionPage();
}
else if(env.IsProduction())
{
//Use Prod Db globally
}
}
此外,在每個控制器中,我都注入了所需的上下文,因此如果我目前正在開發(fā)或生產(chǎn)中,我必須檢查每個端點。有沒有更有效的方法?“惰性”方法是發(fā)布我的api的兩個實例,一個用于prod,另一個用于測試,其中代碼會相應(yīng)地更改。
您可以通過其構(gòu)造函數(shù)將
IWebHostEnvironment
注入Startup
類,該構(gòu)造函數(shù)與Startup.Configure
方法的參數(shù)中的構(gòu)造函數(shù)相同。然后,可以在Startup.ConfigureServices
方法中使用env.IsDevelopment()
,在該方法中設(shè)置DB上下文。我想知道您是否真的希望在開發(fā)和生產(chǎn)環(huán)境中使用不同的數(shù)據(jù)庫上下文。
因此,對于兩種環(huán)境都有一個單一的上下文
MyDbContext
,Startup
類如下所示。然后,您的控制器將被注入MyDbContext
個實例,該實例通過環(huán)境連接到不同的DB。