3

这是我第一次使用 MVC 做一个 web 项目,我试图让它基于三层:MVC、DAL(数据访问层)和 BLL(业务逻辑层)。

我也在尝试使用存储库,并且我正在使用代码优先。

无论如何,我已经在网上搜索了很多,但如果你对我有很好的参考,我会很高兴看到它。

我当前的项目如下所示:

当前的项目

这是我的问题:

  1. 代表表的 Product 和 User 类应该在哪里?看来我需要在 BLL 中使用它们,而在 DAL 中我并不真正需要它们,而是用于PASContext.

  2. 我在哪里启动PASContext?在我在互联网上看到的所有示例中,没有人在存储库中使用 0 参数创建构造函数,这意味着上下文不是在存储库中创建的(我已经阅读了一些原因,为什么所有存储库都会这样使用一个上下文)。

如果我试图在编译器中启动PASContextProductBLL,它说它无法识别它并且我缺少一个引用(尽管我已经添加了所需的引用并且名称PASContext被标记为蓝色,就像 vs 确实识别它一样)

PASContext是继承自的类DbContext

下面是一些代码来演示:

public class ProductsBLL
{
    private EFRepository<Product> productsRepository;
    private List<Product> products;

    public ProductsBLL()
    {
        PASContext context = new PASContext();
        productsRepository = new EFRepository<Product>(context);         
        //LoadData();
    }
  1. 关于视图模型,例如,如果我想为客户提供产品列表,我是否需要创建一个ProductViewModel,从中获取ProductsBLL具有产品列表的数据并将其转换为列表ProductViewModel然后发送到控制器?

此外,在 中ProductController,我是否只发起ProductsBLL?我没有启动任何存储库或上下文,对吗?

如果有人可以向我展示一些使用存储库、三层架构并从数据库中获取数据的项目,将其传输到 BLL 并从那里传输到 MVC 层并使用ViewModel向客户端展示它会很棒。

4

2 回答 2

4

问题 1

代表表的 Product 和 User 类应该在哪里?

我会把这些放在一个可以被所有其他项目引用的项目中。也就是说,所有其他项目都可以依赖于模型的解决方案。在洋葱架构的情况下,模型属于位于解决方案中心的核心。

洋葱架构概述

在你的情况下,我会把它们放在 BLL 中。

问题2

我在哪里启动 PASContext?

您通常不会直接看到此操作的原因是因为使用依赖注入DI非常常见(什么是依赖注入?

这意味着您不需要直接实例化 DbContext;你让 DI 容器为你做这件事。在我的 MVC 应用程序中,上下文具有PerWebRequest 生活方式

PerWebRequest 生活方式:

组件的实例将在单个 Web 请求的范围内共享。该实例将在第一次在 Web 请求范围内被请求时创建。

发出请求时创建上下文,在整个请求中使用(因此所有存储库都获得了第一级缓存的好处),然后在请求完成时处理上下文。所有这些都由 DI 容器管理。

问题 3

我需要创建一个 ProductViewModel [...] 吗?

您通常只有一个视图模型可以提供给视图。视图应该是它自己的对象,它具有视图显示所有内容所需的所有内容。您建议您创建多个视图模型对象并将其传递给视图。我对这种方法的担忧是,如果您想为该视图显示更多信息会发生什么?假设您想向用户显示单个 DateTime 对象。现在您想显示其中的一个,但您将许多对象传递给视图。

相反,把事情分开。创建单个视图模型并将其传递给视图。如果您的视图的一部分需要显示许多内容,请让视图将其称为子操作或部分操作,以便视图不会做太多事情。

你的方法:

方法#1

另一种方法:

方法#2

结论

如果有人可以向我展示一些使用 [...] 三层架构的项目

我不确定三层架构。以下是一些使用各种解决方案架构的示例项目:

没有单一的正确方法——只有好的方法和坏的方法。

于 2013-12-15T02:21:18.120 回答