实体框架 - 我应该从 BLL 还是 DAL 调用 DbContext



我正在创建一个具有以下层的 WPF 应用程序:

UI (视图 + 视图模型) -> BLL -> DAL

所有这些都引用了域模型层。

目前,我正在通过 BLL 将所有数据库调用从 UI 传送到 DAL。但我不确定这是正确的方法。

BLL中的大多数方法如下所示:

public ICollection<User> GetUsers()
{
    return dbAccess.GetUsers();
}

这反过来又在 DAL 中调用类似的方法:

public ICollection<User> GetUsers()
{
    using (var context = new DbContext())
    {
        return context.Users.ToList();
    }
}

1)这种将呼叫从BLL传送到DAL的方式似乎非常多余。当然,有一些 BLL 方法实际上包含一些业务逻辑。我应该放弃 BLL 吗?

2)这种方法的另一个问题是我不能使用延迟加载,因为DbContext是在DAL中创建和处置的。我猜这可以通过在视图模型中创建 DbContext 来解决,但是我应该什么时候处置它呢?

3)最后,由于我没有使用延迟加载,我必须急切加载我的相关实体。但并非所有视图都需要相同的相关实体,因此我经常最终使用几种返回相同实体但包含不同的方法。这还行吗?

X)我所有的数据库方法都存在于一个名为DbAccess的庞大类中。为我的每个 ViewModels(或我的每个实体)创建一个数据库服务类会更好吗?

可以直接从 BL 调用 EF 方法,但这会使 BL 与 EF 绑定得太紧。如果编写单独的 DAL 来访问 EF,则可以在不接触 BL 的情况下替换整个 DAL,如果直接从 BL 调用 EF,这将是不可能的。

您也可以将 DbContext 用于每个 httpRequest,如下所示

public static class ObjectContextPerHttpRequest
{
    public static MyEntities Context
    {
        get
        {
            string objectContextKey = HttpContext.Current.GetHashCode().ToString("ObjectContextPerHttpRequest");
            if (!HttpContext.Current.Items.Contains(objectContextKey))
            {
                HttpContext.Current.Items.Add(objectContextKey, new DomainModel.MyEntities());
            }
            return HttpContext.Current.Items[objectContextKey] as MyEntities;
        }
    }
}

相关内容

最新更新