0

我有一個佈局調用靜態類從數據庫中檢索一些信息,但我正在遷移項目以使用實體框架核心,但您知道我需要通過一個EF Core的實例參數來實例化它,所以我已經將靜態類更改爲非靜態的,但當然現在它抱怨了,因爲我使用靜態簽名從佈局調用該類,並從佈局中調用它,我需要要傳遞該實例參數,所以我需要在佈局中創建一個類來檢索它?我不認爲我會這樣做..我該怎麼辦?任何建議都是值得歡迎的。這是類(我已經更改爲一個實例類爲了有一個實例構造函數,但現在我需要從佈局視圖更改簽名以調用它作爲一個實例類與實例參數... ):從佈局視圖使用EF Core調用類

public class LocationLookup 
    { 
     DataContext context; 
     public LocationLookup(IOptions<DBConnection> connectionsAccessor) 
     { 
      context = new DataContext(connectionsAccessor); 
     } 

     public static List<MyLocations> GetLocations() 
     {    
      var locations = context.MyLocations.OrderBy(x => x.Name).ToList(); 
      return locations; 
     } 
    } 

這是我當前如何調用該方法(我需要改變這個調用它作爲一個實例類,但我怎麼能檢索connectionsAccessor實例參數我在Layout.cshtml看法? )

@{           
     var locations = LocationLookup.GetLocations(); 
    } 

任何建議採用更好的方法

+0

假設你有一個控制器動作,你不能做它在控制器中並設置ViewBag.Locations? – AntDC

+0

絕對刪除'靜態DataContext':上下文應始終是一個實例,並由DI引擎在每個請求上創建。 –

+0

@AntDC我也想過,但我不確定這是更好的方法,在這種情況下,我需要確保在啓動時調用該控制器操作,並在那裏創建ViewBag.Locations – AlexGH

回答

2

最好的辦法是直接在視圖中注入服務。

開始通過打開你的LocationLookup到服務直接依賴你的DbContext

public class LocationLookupService 
{ 
    private readonly DataContext _context; 

    public LocationLookupService(DataContext context) 
    { 
     _context = context; 
    } 

    public List<MyLocations> GetLocations() 
    {    
     var locations = _context.MyLocations.OrderBy(x => x.Name).ToList(); 
     return locations; 
    } 
} 

註冊它在DI發動機:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<DataContext>(<!-- your code -->); 
    services.AddMvc(); 
    services.AddScoped<LocationLookupService>(); 
} 

現在,你是準備注入它裏面你views:

@inject LocationLookupService LocationLookup 

@{ 
    var locations = LocationLookup.GetLocations(); 
}