(我要问2个问题)。
我们使用3层:Bl,Dal,UI。
我们不想为所有对象构建一个大的BL
,DAL
。
因此,我们为Agents
和Leads
创建了此结构。
现在让我说我应该写一个方法:
public Agent GetAgentByLead(Lead leadObj)
{
}
问题#1
此功能应驻留在哪里:AgentsBL
或LeadsBL
?
问题#2
假设我想使用Entity Framework。
查询可以是:
var activeAgents= context.Agents.Where(c => c.ACTIVE).ToList();
此行可以在myPage.aspx.cs
文件中执行。
所以哪里是这里的图层?背景将在哪里?
我只是不知道EF如何处理图层(就像我的第一个问题)
请帮忙吗?
答案 0 :(得分: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);
}
}
通过这种方式,您可以模拟出您的查询,存储库并测试您的控制器,如果您愿意,也不会最终使用难以维护的巨大数据访问器类。
答案 1 :(得分:1)
1)这是一个自行创建的问题,为每个实体设置DAL并不是一个习惯或好主意。但是假设它们太大了你想分开它们,我会说GetAgentForSomething()
属于AgentsDAL。然后,这将依赖于潜在客户。你必须在这里注意循环依赖,你可能必须定义单独的DAO和Domain类。
2)context.Agents.Where(...)
正在规避分层。考虑AgentsDAL.GetActiveAgents()