現在、sqlite を使用して Windows アプリケーションを構築しています。データベースには というテーブルがUser
あり、私のコードには aRepository<User>
と aがありUserManager
ます。よくあるデザインだと思います。リポジトリにはList
メソッドがあります:
//Repository<User> class
public List<User> List(where, orderby, topN parameters and etc)
{
//query and return
}
で複雑なことをしたい場合、これは問題を引き起こしますUserManager.cs
:
//UserManager.cs
public List<User> ListUsersWithBankAccounts()
{
var userRep = new UserRepository();
var bankRep = new BankAccountRepository();
var result = //do something complex, say "I want the users live in NY
//and have at least two bank accounts in the system
}
List<User>
クエリが予想よりも早く実行されるため、返すとパフォーマンスの問題が発生することがわかります。今、私はそれを次のようなものに変更する必要がありますIQueryable<T>
:
//Repository<User> class
public TableQuery<User> List(where, orderby, topN parameters and etc)
{
//query and return
}
TableQuery<T>
IQueryable<T>
クエリを提供し、すぐには実行しない EFとほぼ同じ sqlite ドライバーの一部です。しかし、問題は次のとおりです。 ではUserManager.cs
、 が何であるかがわからないTableQuery<T>
ため、新しい参照を追加using SQLite.Query
し、ビジネス レイヤー プロジェクトのように名前空間をインポートする必要があります。それは本当に悪いコード感をもたらします。ビジネス層がデータベースの詳細を知る必要があるのはなぜですか? ビジネス層が SQLite とは何かを知る必要があるのはなぜですか? では正しいデザインとは?