2

(2つ質問させてください)。

Bl 、 Dal 、 UI の 3 つのレイヤーを使用します。

ここに画像の説明を入力

すべてのオブジェクトに対してBL、1 つの大きな を作成したくありませんでした。DAL

そこで、Agentsとの両方でこの構造を作成しましLeadsた。

ここで、メソッドを書く必要があるとしましょう:

public Agent GetAgentByLead(Lead leadObj)
 {
 }

Question #1

この機能はどこにあるべきですか :AgentsBLまたはLeadsBL?

Question #2

Entity Framework を使いたいとしましょう。

クエリは次のようになります。

var activeAgents= context.Agents.Where(c => c.ACTIVE).ToList();

この行はmyPage.aspx.csファイルで実行できます。

ここのレイヤーはどこですかコンテキストはどこに存在しますか?

EFがレイヤーをどのように処理するかわかりません(最初の質問のように)

何か助けてください。

4

2 に答える 2

3

この種のものに一般的に使用されるパターンはリポジトリパターンです。グーグルで検索すると大量の情報が見つかります。基本的に、コンテキストをカプセル化するリポジトリを作成するため、直接使用することはありません...

私は一般的なCRUDメソッドを備えた汎用リポジトリを好みますが、次のようなものもあります。

IEnumerable<T> FindAll(IQuery<T> query);

したがって、特定のクエリを実行するためにオブジェクトタイプごとに一意のリポジトリを作成する必要はなく、たとえば、GetAgentByLeadそのロジックをクエリにラップしてコンテキストを渡すので、クエリ、リポジトリ、およびコントローラー(MVCを想定)はすべて分離され、お互いに依存しています。

クエリオブジェクトの例は次のようになります。

public interface IQuery<T>
{
    IEnumerable<T> Execute(IContext context);
}

public class FindAllUsersInGroupQuery : IQuery<User>
{
    public int GroupId {get; set;}

    IEnumerable<User> Execute(IContext context)
    {
        return context.DoSomeQueryForGettingUsers(GroupId);
    }
}

このようにして、クエリ、リポジトリをモックアウトし、必要に応じてコントローラをテストできます。また、保守が難しい巨大なデータアクセサクラスになってしまうこともありません。

于 2012-10-24T09:05:02.177 に答える
1

1)これは自己作成の問題であり、エンティティごとにDALを設定することは慣習的または良い考えではありません。しかし、それらを分割したいほど大きいと仮定するとGetAgentForSomething()、AgentsDALに属していると思います。そして、それはリードに依存します。ここでは循環依存に注意する必要があります。個別のDAOクラスとドメインクラスを定義する必要がある場合があります。

2)context.Agents.Where(...)階層化を回避しています。検討AgentsDAL.GetActiveAgents()

于 2012-10-24T09:04:03.933 に答える