我開始一個新項目,希望利用.NET中的異步/等待項目以及實體框架(版本6.1)中的新異步操作。然而,我很好奇的是如何重構我的應用程序的某些部分以減少代碼重複以及在給定EF的非線程安全特性的情況下完成此操作的最佳方式。使用實體框架和重構異步/等待問題
例子,我有我的業務層的一些方法,看起來像這樣
public async Task<MyViewModel> GetProgramIndexAsync(long programId){
using (var db = new DbEntities())
{
var program = await db.Programs.FirstOrDefaultAsync(x => x.Id == programId && x.Active);
if (program == null)
{
throw new ApplicationException("Cannot find the requested program");
}
//more code to populate the view model
}
}
到目前爲止,一切都很好。但我發現自己在這個服務層的多個地方進行檢查。什麼是理想的做法是提取到一個單獨的功能
private async Task<Program> GetProgramAsync(long programId){
using (var db = new DbEntities())
{
var program = await db.Programs.FirstOrDefaultAsync(x => x.Id == programId && x.Active);
if (program == null)
{
throw new ApplicationException("Cannot find the requested program");
}
return program;
}
}
現在,我的公共服務層調用只需調用這個函數,而不必重複此每次檢查。
var program = await GetProgramAsync(programId);
我擔心的是爲這些請求中的每一個請求啓用多個上下文。在過去的(同步),我可以簡單地具有第二功能參數如
private async Task<Program> GetProgramAsync(long programId, DbContext db){
和現存上下文傳遞到方法。不過,我認爲這會對異步/等待性質造成影響。
我在想這個(多語境並不差)還是有更好的方法來完成這個?我應該注意到這些調用是隻讀的,我不會以這種方式更新實體。
謝謝!我想我可能會略微誤解異步的工作流程及其對EF的影響,但不希望只是爲了不必重構所有內容。 – Tommy