0

このリポジトリパターンを動作させる方法を理解するのに少し問題があります。一言で言えば遅延読み込みのためオブジェクトが読み込まれません。 BLLからすべてのオブジェクトを返す方法

、私の解決策は、次のようになります...

 ASP.Net MVC 
      ^
      | 
     Business Logic 
      ^
      | 
     Data Access 
(Repositories and Unit of Work) 
      ^
      | 
    Entity Framework Models 

私はロールテーブルを参照して、ユーザーテーブルを持っています。

私のMVCアプリケーションでは、私はGetAllUsersでBLLを呼び出します。 BLLのコードは次のようになります。

public List<User> GetAllUsers() 
{ 
    using (UnitOfWork uow = new UnitOfWork()) 
    { 
     UserRepository userRepository = new UserRepository(uow); 
     return userRepository.GetAll().ToList(); 
    } 
} 

UserRepositoryがGETALLを(持っているGenericRepositoryから派生)

public class GenericRepository<T> : IGenericRepository<T> where T : class 
{ 
    private IUnitOfWork _uow = null; 

    public GenericRepository(IUnitOfWork uow) 
    { 
     _uow = uow; 
    } 

    public virtual IQueryable<T> GetAll() 
    { 
     return _uow.Set<T>().AsQueryable(); 
    } 
} 

それは私のMVCアプリケーションにユーザーのリストを返しますが、私がしようとすると、役割参照にアクセスすると、遅延読み込みのためにまだロードされていません。

public ActionResult Index() 
{ 
    BusinessLogic.Account blAcct = new BusinessLogic.Account(); 
    List<User> users = blAcct.GetAllUsers(); 

    string firstName = users.FirstName; // Works fine 
    string role = users.Roles.RoleName; // Fails because the context is closed. 

    return View(); 
} 

私はGetAllUsersに.INCLUDE(役割)を置くことを試みたが、.INCLUDEはIQueryableを使用できません。

MVCアプリケーションがコンテキストやデータアクセスについて何も知る必要がないと考えるのは理論的には言えますか? そして、BLLを離れる前に、このロールの参照をグラフにどのように含める必要がありますか?

答えて

1

現在のアプリケーションアーキテクチャを指定したMVCアプリケーションは、DataContextとデータの取得には関係しません。コンテキスト与えられ、適切である方法を使用して選択的にそして

public IList<Users> GetAllUsersWithRoles()

溶液が熱心にあなたRolesをロードする別のRepositoryメソッドを追加することができます。

+0

私は喜んでこれを行いますが、私のUserRepositoryでもIQueryableを使用しており、コンテキストにアクセスすることはできません。コンテキストは、作業単位で完全に制御されます。おそらく、UoWとリポジトリがどのように構築されているのかを再考する必要があります。 – Scottie

+0

'UoW'クラスを介して' DataContext'を公開メソッドとして公開メソッドとして公開することができます。これはコードのにおいのように感じます。 – xandercoded

+0

もう一つのオプションは、リポジトリに 'DataContext'を(コンストラクタを介して)受け取り、' IoCコンテナ 'を使ってリポジトリに注入させることです。 'Retrieating'、' Insert'、 'Deleting'ではなく、' Retrieval'の間だけこのコンテキストを使用します – xandercoded

1

私はこのような状況にありましたが、ここでコードを「すてきでいい」ものにしたいと思っていますが、抽象化では基本的な実装を自由に制御することはできません。

まず、重要な質問をしましょう。使用しているOR/Mを別の実装に切り替える可能性はどれくらいですか?

非常におそらく、抽象化が本当に必要な場合は、すべての遅延フェッチで失われるパフォーマンスが重要かどうかによって異なります。多分それは問題ではないでしょうか?それから、N + 1回のクエリでOKです。

ただし、パフォーマンスが許容範囲外の場合は、IQueryableIncludeメソッドを含む独自のインターフェイスを追加することができます。あなたは根本的な機能の多くをしたい場合は、醜いの種類を取得します。

閉じたセッションを回避するには、セッションのライフスタイルをより高いレベルに移動するか、より具体的な方法を使用してDTOを返すことができます。それでは、何が遅れているのか、何がないのか分からないという問題はありません。

関連する問題