c# - 如何在 asp.net core 2 中的静态方法/类中访问数据库上下文
问题描述
我有一个带有 EF 6 的 asp.net core 2 web 应用程序。到目前为止,我使用 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 填充该属性。
推荐阅读
- html - 在具有指定尺寸的 div 内部时,图像宽度和最大宽度有什么区别?
- mysql - docker 卷已删除,但似乎已缓存
- python - 遍历 csv 文件中的列以获取请求
- c - 错误:14089086:SSL 例程:ssl3_get_client_certificate:证书验证失败
- r - ggplot2没有找到对象+图例问题
- dart - Mac OS 上的 Protobuf dart 生成找不到 protoc-gen-dart
- python-3.x - 如何将 Web 应用程序上传到生产服务器?
- html - 固定 div 仅在一页上不占全宽
- scala - Databricks Scala net.liftweb.json parse() 无法初始错误
- javascript - JavaScript:setAttribute 函数失败