0

静的クラスを呼び出してデータベースから情報を取得するLayoutがありますが、プロジェクトをエンティティフレームワークコアに移行していますが、 EFコアのインスタンスパラメータをインスタンス化して、静的クラスを非静的に変更しましたが、静的シグネチャを持つレイアウトからそのクラスを呼び出して、必要なレイアウトから呼び出すことができますそのインスタンスパラメータを渡すために、私はそれを取得するレイアウトでクラスを作成する必要がありますか?私はそれをするとは思わない..私は何ができますか?どんな提案も大歓迎です。レイアウトビューからEFコアを使用したコールクラス

これはクラスです(インスタンスコンストラクタを使用するためにインスタンスクラスに変更しましたが、インスタンスパラメータとしてインスタンスクラスとして呼び出すために、レイアウトビューからシグネチャを変更する必要があります... ):

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(); 
    } 

任意より良いアプローチの提案は歓迎です

+0

コントローラの操作があるとします。することはできませんそれはコントローラ内にあり、ViewBag.Locationsを設定しますか? – AntDC

+0

必ず '静的なDataContext'を削除してください:コンテキストは常にインスタンスであり、すべてのリクエストに対してDIエンジンによって作成されるべきです。 –

+0

@AntDC私はそれについても考えていますが、それがより良いアプローチであるかどうかはわかりません。その場合、起動時にそのコントローラーアクションを呼び出してそこにViewBag.Locationsを作成する必要があります – AlexGH

答えて

2

あなたの最善の策は、ビューに直接サービスを注入することです。あなたのDbContextに直接依存関係を持つサービスにあなたのLocationLookupを回して

スタート:

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(); 
} 
関連する問題