从布局视图

时间:2017-04-24 15:26:34

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

我有一个调用静态类的Layout来从数据库中检索一些信息,但是我正在将项目迁移到使用实体框架核心,但是你知道我需要将一个实例参数传递给EF Core来实例化它现在,所以我已经将静态类更改为非静态类,但当然现在它正在抱怨因为我从布局中使用静态签名调用该类,并从布局中调用它我需要传递该实例参数,所以我需要在Layout中创建一个类来检索它吗?我不认为我会这样做..我该怎么办?欢迎提出任何建议。

这是类(我已经改为实例类,以便拥有实例构造函数,但现在我需要从Layout视图更改签名,将其作为带有instance参数的实例类调用...) :

  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实例参数?我在{{1}观点)

Layout.cshtml

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

1 个答案:

答案 0 :(得分: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>();
}

现在你准备将它注入你的观点中了:

@inject LocationLookupService LocationLookup

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