簡體   English   中英

如何在asp.net core 2中的靜態方法/類中訪問db上下文

[英]how to access db context within a static method/class in asp.net core 2

我有一個帶有 EF 6 的 asp.net core 2 webapplication。到目前為止,我一直使用 db context 的方式是使用 asp.net core 提供的依賴注入將上下文注入控制器:

protected DbContext dbContext;

public BaseController(DbContext context)
{
    dbContext = context;
}

在我的許多 razor 視圖中,我調用了一個擴展方法來初始化一個 Telerik 網格,並傳遞它的選項。 到目前為止,我還不需要訪問 db 上下文,但現在我需要在擴展方法中訪問它以實現某些邏輯:

    public static GridBuilder<T> BaseProcessGrid<T>(this GridBuilder<T> helper, string controllerName, string gridName)
       where T : class, IProcessViewModel
    {
        bool showDelete = false;

        //check if the current user has edit rights 
        using (var db = new DbContext())
        {
            var users = db.Users.ToList(); // <--- this just doesn't get any records.
        }

當試圖從靜態方法中實例化一個新的數據庫上下文時,它只是不獲取任何記錄。 我需要弄清楚如何實際訪問 DbContext 的新實例,或者以某種方式訪問​​在我的 Startup.cs 中定義的范圍服務:

services.AddScoped(_ => new MantleMapperContext(Configuration.GetConnectionString("DbContext")));

編輯:

如下所示,我最終將 dbContext 服務直接注入到我的視圖中,然后像這樣將其傳遞到方法中:

@inject DbContext dbContext

您將必須傳入您的DbContext ,或者從容器中獲取一個實例,您反過來也需要一個靜態引用(這會使大多數代碼審查失敗)。

做你正在做的事情,它在沒有連接字符串的情況下進行初始化,因為它在注入時會被連接起來。

由於這是static的解決方案是傳入DbContext

public static GridBuilder<T> BaseProcessGrid<T>(this GridBuilder<T> helper, DbContext db, string controllerName, string gridName)
   where T : class, IProcessViewModel
{
    bool showDelete = false;

    var users = db.Users.ToList(); // <--- gets records.

更新

我將如何從剃刀視圖中做到這一點?

我相信您可以將服務注入視圖。

服務注入

可以使用@inject 指令將服務注入到視圖中。 您可以將@inject 視為向視圖添加屬性,並使用 DI 填充該屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM