我正在尝试创建一个使用 EF 处理数据访问的小型个人项目。我的项目架构有 UI 层、服务层、业务层和数据访问层。EF 包含在 DAL 中。我认为从我的 UI 中引用我的 DAL 是不对的。所以我想为我的所有层之间共享的“业务对象”创建自定义类。
示例:我有一个用户表。EF 创建一个用户实体。我有一个方法可能是 GetListOfUsers()。在演示文稿中,不应回复列表,因为 UI 会直接链接到 DAL。我可能需要在 DAL 中公开一个方法,可能类似于:
List<MyUserObject> GetListOfUsers();
然后调用我的内部方法 GetListOfUsers 返回用户实体列表,然后将它们转换为我的 MyUserObejcts,然后通过层传递回我的 UI。
那是正确的设计吗?我不认为 UI 或业务层应该对实体框架有任何了解。
然而,这可能意味着什么,也许我需要在我的 DAL 和我的业务层之间有一个“转换层”,它将我的实体转换为我的自定义对象?
编辑:
这是我正在做的一个例子:
我有一个数据访问项目,其中将包含实体框架。在这个项目中,我将有一种方法来获取状态列表。
public class DataAccessor
{
taskerEntities te = new taskerEntities();
public List<StateObject> GetStates()
{
var transformer = new Transformer();
var items = (from s in te.r_state select s).ToList();
var states = new List<StateObject>();
foreach (var rState in items)
{
var s = transformer.State(rState);
states.Add(s);
}
return states;
}
}
我的 UI/业务/服务项目一定不知道实体框架对象。相反,它必须知道我自定义构建的 State 对象。所以,我有一个共享库项目,其中包含我的自定义构建对象:
namespace SharedLib
{
public class StateObject
{
public int stateId { get; set; }
public string description { get; set; }
public Boolean isDefault { get; set; }
}
}
因此,我的 DAL 将项目放入实体对象列表中,然后我将它们传递给我的转换方法,以使它们成为自定义的构建对象。转换采用 EF 对象,并输出自定义对象。
public class Transformer
{
public StateObject State (r_state state)
{
var s = new StateObject
{
description = state.description,
isDefault = state.is_default,
stateId = state.state_id
};
return s;
}
}
这似乎有效。但这是一个有效的模式吗?