C# 使用布局视图中的EF核心调用类

C# 使用布局视图中的EF核心调用类,c#,entity-framework,razor,asp.net-core-mvc,entity-framework-core,C#,Entity Framework,Razor,Asp.net Core Mvc,Entity Framework Core,我有一个布局,它调用一个静态类来从数据库中检索一些信息,但是我正在迁移项目以使用entity framework core,但是您知道我现在需要将一个实例参数传递给EF core来实例化它,所以我把静态类改成了非静态类,但是现在它在抱怨,因为我从带有静态签名的布局调用这个类,要从布局调用它,我需要传递那个实例参数,所以我需要在布局中创建一个类来检索它?我想我不会那样做。。我能做什么?欢迎提出任何建议 这就是类(为了拥有实例构造函数,我已更改为实例类,但现在我需要更改布局视图中的签名,以使用实例参

我有一个布局,它调用一个静态类来从数据库中检索一些信息,但是我正在迁移项目以使用entity framework core,但是您知道我现在需要将一个实例参数传递给EF core来实例化它,所以我把静态类改成了非静态类,但是现在它在抱怨,因为我从带有静态签名的布局调用这个类,要从布局调用它,我需要传递那个实例参数,所以我需要在布局中创建一个类来检索它?我想我不会那样做。。我能做什么?欢迎提出任何建议

这就是类(为了拥有实例构造函数,我已更改为实例类,但现在我需要更改布局视图中的签名,以使用实例参数将其作为实例类调用…):


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

您最好的选择是直接在视图中注入服务

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

最好是直接在视图中注入服务

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

假设你有一个控制器操作,你不能在控制器中执行它并设置ViewBag.Locations吗?绝对要删除
静态DataContext
:context应该始终是一个实例,由DI引擎根据每个请求创建。@AntDC我也考虑过这一点,但我不确定这是更好的方法,在这种情况下,我需要确保在启动时调用该控制器操作并创建ViewBag。其中的位置为什么在启动时?请注意,您可以像在控制器上一样。@FedericoDipuma您共享的链接很棒:)。我现在不知道在视图中注入依赖项的
@inject
语法。请把它作为一个答案,这样我可以给你点,并选择它作为答案谢谢!假设你有一个控制器操作,你不能在控制器中执行它并设置ViewBag.Locations吗?绝对要删除
静态DataContext
:context应该始终是一个实例,由DI引擎根据每个请求创建。@AntDC我也考虑过这一点,但我不确定这是更好的方法,在这种情况下,我需要确保在启动时调用该控制器操作并创建ViewBag。其中的位置为什么在启动时?请注意,您可以像在控制器上一样。@FedericoDipuma您共享的链接很棒:)。我现在不知道在视图中注入依赖项的
@inject
语法。请把它作为一个答案,这样我可以给你点,并选择它作为答案谢谢!
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;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DataContext>( <!-- your code --> );
    services.AddMvc();
    services.AddScoped<LocationLookupService>();
}
@inject LocationLookupService LocationLookup

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