0

私はSalesmanRepositoryを持っています。私のデータベースのすべての営業担当者が表示されます。 結果をグリッド(Webインターフェイスを想像してください)に表示したいので、ユーザーはフィールドを表示または非表示にしたり、列を並べ替えたり、ページングを使用したりできます。リポジトリパターンの並べ替え、ページングおよび緩やかに結合

私は非常に大きなセットを持っていると仮定して、並べ替えとページングはサーバー側である必要がありますする必要があります。

私の質問では、どうすれば私のアーキテクチャに疎結合することができますか?

  1. データベースの列の名前をUIの列にバインドする必要はありません。後で新しいタイプのデータベースを柔軟に変更したいと思っています。
  2. ページングは​​どのように処理する必要がありますか?例えばpagenumberOfItemsPerPageのようなパラメータをリポジトリのメソッドに直接追加することで、
  3. ソートにもどのようにアプローチすればよいですか?私は、データベースの列の名前をソートパラメータにバインドすることを嫌います。新しいタイプのデータベースを持つことができ、すべてのソフトウェアを壊すことになります。

基本的に、どのようにこれらの概念にアプローチして、疎結合したままにすることができますか?理想的には、言語にとらわれないアプローチが欲しいですが、より良い言語固有の答えがある場合はC#を使用しています。


EDIT:どのように私はフィールドでソートするために私のリポジトリは、直接フィールドの名前を言及せず、伝えることができます:私の質問があるように、より正確にすることができますか?


EDIT 2:私はフィールドでソートする私のリポジトリをお伝えしたいと思いますが、私のリポジトリのインターフェースは私のビジネスロジック層であるので、私は実装にバインドされたくない(またはドメイン層)。

Nameという名前のテーブルがSalesmanというMySQLデータベース(したがってSalesmanMySQLRepository)があるとします。

のは私も同じ列Nameが含まSalesmanという名前のテーブルで(SalesmanSQLRepository付き)SQL Serverデータベースを持っていることを今言ってみましょうが、私のチームは、プレフィックスのいくつかの並べ替えをすることにしましたので、ここで私が代わりにBobbyNameをという名前を付けます何らかの理由で列で。詳細なものであり、ビジネスロジックとは何の関係もありません。

SalesmanRepositoryはどのように見えるのですか?私は文字列を直接送信したくないので、それぞれの実装が全く違うからです。私はPagedResult<Salesman> List(SortingParameter field)のようなメソッドがあると思いますが、どのようにこのパラメータを処理する必要がありますか?

+0

あなたのデータモデルとビューの間のViewModelに別の抽象化を探しているようですね? –

+0

ViewModelがソートやページングをどのように手伝ってくれますか? – MiniW

+0

小さなデータセットの場合は、pageSzieやその他のフィルタやリポジトリ内のソートを気にする必要はなく、コントローラ(MVCパターン)はページング、ソート、フィルタリングを処理する必要があります。大規模なデータセットの場合は、OData(http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api)を使用し、データをサービスとして公開します。 – din

答えて

0

私は一度それを行いました。だから私は代わりにクライアントリストのページを管理することができ

public class ClientPage 
{ 
    private int PageIndex; 
    private int PageLengh; 
    private List<Client> Clients; 
    private int ClientsCount; 
} 

:私のようなオブジェクトを作成することで、この問題を解決しました。

これは何とか役立ちます。

+0

私は 'PagedResult 'を持つことができます。しかし今、私はまだ私の_ソート_問題を解決する必要があります。 – MiniW

+0

あなたのソートの問題を理解できませんでした。並べ替えアルゴリズムのみ、またはdbから取り込まれたすべての並べ替えセットをページする方法が必要ですか?私は第二の選択肢を取る。このためには、すべてのデータをサーバーメモリに格納してクライアントに送信することをお勧めします。 PageIndexとPageLenghtはこの目的のためのものです。たとえば、リストに10個のデータがあり、3個ずつ3個を送信する場合は、インデックス1の長さ3のクライアントページを3つの最初のデータで送信し、2番目のページのインデックス4の長さ3を送信する必要があります。これがうまくいくと思っています – guijob

+0

私は百万のエントリを持っているとしましょう。フィールド "Name"(例えば)によって順序付けられたページ1の最初のn個のエントリが必要な場合は、最初にn個のエントリをフェッチしてクライアント側にソートすることはできません。私はそれらをサーバー側で並べ替える必要があります。つまり、私のデータベースのカラム名は "Name"という名前になっていますが、私は疎結合したままにする方法を見つけたいと思います。ビジネスロジックが自分のリポジトリから文字列「名前」を送信し、その文字列を実装で直接使用することは望ましくありません。私は疎結合のソリューションを探しています。 – MiniW

0

あなたが

public static IEnumerable<T> SortingAndPaging<T>(IEnumerable<T> entities, int pageSize, int pageNum, string sortField, string order) 
{  
    //your sorting and paging logic goes here, maybe Linq is helpful here 
} 
などの共有方法をコーディングすることができますので、あなたは、私はあなたがページングやソートを行うことができます唯一の場所がメモリにあると思いますが、ページングやクライアントとデータベースの両方に並べ替えをしたい、そうしていないようですこのことにより、

、私たちは私がソートし、オブジェクトにそのプロパティ名を検索するためにリフレクションを使用したいものとして、バックエンドに列ヘッダー内のテキストを送信することで解決するデータベースに依存しない

0

を達成することができます。列の表示名が、アルゴリズムまたはルックアップによってフィールド名に変換可能であることを確認する必要があります。以下のコードはpseudo-ishですが、メソッドは実線です。

フロントエンド:

<th class="sortable">Last Name</th> ... 
$('.sortable').onClick(function(event){ 
     //send request to backend with text of header as sortBy 
     ... 
}); 

バックエンド:

List<Person> GetPeople (string sortBy) 
{ 
    //Person has property lastName 
    var propery = Person.GetField(SortByStringToPropertyName(sortBy)); 
    List<Person> people = db.Persons.OrderBy(property).ToList(); 
    return people; 
} 
関連する問題