【问题标题】:Call class using EF Core from Layout view使用 EF Core 从布局视图调用类
【发布时间】:2017-04-24 15:26:34
【问题描述】:

我有一个布局,它正在调用一个静态类来从数据库中检索一些信息,但是我正在迁移项目以使用实体框架核心,但你知道我需要将一个实例参数传递给 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();
  }

欢迎任何更好的方法的建议

【问题讨论】:

  • 假设你有一个控制器动作,你能不能不在控制器中做它并设置 ViewBag.Locations?
  • 绝对删除 static DataContext:上下文应该始终是一个实例,并且由 DI 引擎在每个请求上创建。
  • @AntDC 我也考虑过,但我不确定这是更好的方法,在这种情况下,我需要确保在启动时调用该控制器操作并创建 ViewBag.Locations在里面
  • 为什么在启动时?请注意,您可以像在控制器上一样inject dependencies in Views
  • @FedericoDipuma 您分享的链接很棒:)。我现在不知道在视图中注入依赖项的 @inject 语法。请把它作为答案,这样我就可以给你点并选择它作为答案谢谢!

标签: c# entity-framework razor asp.net-core-mvc entity-framework-core


【解决方案1】:

最好的办法是直接在视图中注入服务。

首先将您的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>();
}

现在您已准备好将其注入您的视图中:

@inject LocationLookupService LocationLookup

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多