1

スタックオーバーフローですでに何度も論争されている問題について質問がありますが(これについてはお詫びします)、あるケースから別のケースへのトピックの主観性のため、一般的な回答はこれまでにありませんでした:ビジネスロジックを追加できますかリポジトリパターンに従ったリポジトリレイヤー?私はViewModelsを備えたMVC3アプリケーションを持っています(つまり、ViewDataをまったく使用していません)。モデルはもちろんデータベースに接続されたLinqtoSQLEFです。現在、すべてのビジネスロジックを含むコントローラーからエンティティに直接アクセスしており、ビューに必要なデータを特定のViewModelにラップしています。今私はリファクタリングを始めており、ViewModelsを最適化する以外に、コードの重複を回避する最善の方法は、EFと通信するリポジトリにすべてのクエリを委任することであることに気付きました。コントローラが使用するように調整されたメソッドを作成します。ここで、リポジトリが式ではなく実際のオブジェクトを返すようにしたいことを考慮して、コードを明確にするために、ビジネスロジックの小さな部分をリポジトリに委任することを考えていました。ただし、緩い結合のために、ご意見をお聞かせください。以下に示すコード(現在コントローラーに存在します)では、以下を除くすべての変数 lprojectionPercactualValueはデータベースから取得されます。したがって、このコードをリポジトリに移動して、署名付きのメソッドを呼び出したいと思いました。

public string getColor (int ItemId, float lprojectionPercactualValue);

そのアイテムに固有の値を取得するには、メソッドにItemIdが必要です。この設計上の決定についてどう思いますか?コードをコントローラーに残すか、コントローラー内の別のメソッドに移動するか(メソッドを作成するか、専用のクラスを作成する)、説明に従ってリポジトリに移動する方がよいでしょうか。

if (litem.Ascending == true)
{
    if (lprojectionPercactualValue < lminThreshold)
    {
        lcolor = "RED";
    }
    else if (lprojectionPercactualValue > lminThreshold && lprojectionPercactualValue < lmedThreshold)
    {                                   
        lcolor = "YELLOW";
    }
    else //(percValue >= item.Max_Threshold)
    {
        lcolor = "GREEN";
    }
}

else
{
    if (lprojectionPercactualValue > lminThreshold)
    {
        lcolor = "RED";
    }
    else if (lprojectionPercactualValue < lminThreshold && lprojectionPercactualValue > lmedThreshold)
    {
        lcolor = "YELLOW";
    }
    else //(percValue <= item.Max_Threshold)
    {
        lcolor = "GREEN";
    }
}
4

3 に答える 3

0

推奨されません。

リポジトリは今どうlminThresholdですか?この値自体がルックアップテーブルまたは構成ファイルから取得する必要がある場合はどうなりますか?

それをビジネスレイヤーに移動します。ビジネスレイヤーがない場合は、コントローラーに移動します。

于 2011-04-07T12:44:42.467 に答える
0

リポジトリクラスを介してプロキシするDALレイヤー内にEFロジックをラップします。これは生データであり、追加の処理が必要なため、これを使用してカスタムビジネスルールを適用するサービスレイヤーを用意することをお勧めします。ここでのリポジトリは、DBコードの重複を防ぐことを目的としています。

この時点では、lprojectionPercactualValueが何らかのしきい値を超えているかどうかのみを確認しますが、ある時点で、そのしきい値をなんらかの方法で計算する必要がある場合、または何らかの検証などを実行することにした場合はどうなりますか。これらはすべてドメイン固有の決定であり、独自のレイヤーに存在する必要があります。

于 2011-04-07T12:57:40.377 に答える
0

IMHO、コントローラーとリポジトリの間にビジネスレイヤーを追加し、上記のgetColorコードをビジネスレイヤーに配置する(または必要に応じていくつかのメソッドに分割する)ことをお勧めします。他のコントローラーで必要な場合はどうなりますか。もはや単純なif/elseではありません。明日Webサービスからしきい値を取得する必要がある場合、コントローラーまたはリポジトリコードでこれらすべての変更を行いますか?

于 2011-04-08T03:33:07.453 に答える