7

私はASP.NET MVC4エンティティフレームワーク5を使用しています。リポジトリパターン内のIDでフィルタするのは悪い習慣です

本質的にすべてのコントローラーアクション結果は、ログインしたユーザーの企業IDによってdb結果をフィルターに掛けます。私はちょうどコントローラからDbContextを直接フィルタリングするのではなく、モデルを返すためのリポジトリパターンを実装し始めました。 (メソッドの結果をフィルタリングするためにcompanyIDをリポジトリに渡す)

これを行うことは悪い習慣であるが、対象に関する情報を見つけることができないという面白い気持ちがある。私は以下の私の現在のコードの基本バージョンを挿入します、それは悪い習慣であるかどうかについての情報と、そういう理由で感謝します。

IBookingSystemRepository.cs

public interface IBookingSystemRepository : IDisposable 
{ 
    IEnumerable<Appointment> GetAppointments(); 
    IEnumerable<Appointment> GetAppointments(bool includeDeleted); 
    IEnumerable<Client> GetClients(); 
    IEnumerable<Client> GetClients(bool includeDeleted); 
    void Save(); 
} 

BookingSystemRepository.cs

public class BookingSystemRepository : IBookingSystemRepository 
{ 
    private BookingSystemEntities db; 
    int CompanyID; 

    public BookingSystemRepository(BookingSystemEntities context, int companyID) 
    { 
     this.db = context; 
     this.CompanyID = companyID; 
    } 

    public IEnumerable<Appointment> GetAppointments() 
    { return GetAppointments(false); } 

    public IEnumerable<Appointment> GetAppointments(bool includeDeleted) 
    { 
     return includeDeleted 
      ? db.Appointments.Where(a => a.User.CompanyID == CompanyID) 
      : db.Appointments.Where(a => a.User.CompanyID == CompanyID && a.Deleted.HasValue); 
    } 

    public IEnumerable<Client> GetClients() 
    { return GetClients(false); } 

    public IEnumerable<Client> GetClients(bool includeDeleted) 
    { 
     return includeDeleted 
      ? db.Clients.Where(c => c.CompanyID == CompanyID) 
      : db.Clients.Where(c => c.CompanyID == CompanyID && c.Deleted.HasValue); 
    } 

    public void Save() 
    { 
     db.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     if (db != null) 
      db.Dispose(); 
    } 
} 

TestController.cs

public class TestController : Controller 
{ 
    private BookingSystemEntities db = new BookingSystemEntities(); 

    public ActionResult AppointmentsList() 
    { 
     var user = db.Users.Single(u => u.Email == User.Identity.Name); 
     IBookingSystemRepository rep = new BookingSystemRepository(db, user.CompanyID); 
     return View(rep.GetAppointments()); 
    } 
} 

事前にお手伝いいただきありがとうございます。

答えて

4

マルチテナントアプリケーションです。各企業のデータを分離しておくためには、フィルタリングが必要です。あなたのアプローチは健全なものです。可能であれば、下流のリポジトリメソッドを個別にフィルタリングするのではなく、すでにフィルタリングされているコンテキストを提供してください。

+0

ご協力ありがとうございました。私は、リポジトリに渡す前にコンテキストをフィルタリングすることも考えていませんでした。あなたのアプローチが私にとってもっと簡単になると思います! ただし、明確にするために、コンストラクタに渡されたIDに基づいてすべてのDbSetsをフィルタリングする新しいDbContextクラスを作成することを意味しますか? –

+1

それは興味深い考えです。あなたがそれを取り除くことができればそれはいいだろう。いいえ、私はあなたの通常のリポジトリにフィードするリポジトリまたはDBContextWrapperクラスをもっと考えていました。セキュリティの観点からは、DBContextをフィードする最も良い方法は、既にフィルターされたビューをデータベースエンジンに提供することです。しかし、あなたはどれくらいの時間を持っているのか分かりません。 :) –

+0

それでは、本質的に企業レベルのすべてをフィルタリングする、この1つとDbContextの間に別のリポジトリを作成しますか? データベースビューを使用してフィルタリングすることについてのあなたの考えは、おそらく最良の選択肢ですが、私は現在それを行う時間がありません。 とにかく、あなたの援助ロバートに感謝します。 :) –

関連する問題