2

(我要问2个问题)。

我们使用 3 层:Bl、Dal、UI。

在此处输入图像描述

我们不想为所有对象构建一个大BL的。DAL

所以我们为Agents和都创建了这个结构Leads

现在假设我应该写一个方法:

public Agent GetAgentByLead(Lead leadObj)
 {
 }

Question #1

这个函数应该驻留在哪里:AgentsBLLeadsBL

Question #2

假设我想使用实体框架。

查询可以是:

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

此行可以在myPage.aspx.cs文件中执行。

那么这里的图层在哪里?上下文将驻留在哪里?

我只是不明白 EF 如何处理层(就像我的第一个问题)

请问有什么帮助吗?

4

2 回答 2

3

这类事情的一个常用模式是Repository Pattern,如果你用谷歌搜索它,你会发现大量信息,这个想法是你基本上创建一个封装上下文的存储库,所以你永远不会直接使用它......

我更喜欢具有通用 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 和 Domain 类。

2)context.Agents.Where(...)是规避分层。考虑AgentsDAL.GetActiveAgents()

于 2012-10-24T09:04:03.933 回答