asp.net-mvc - 模型在我的解决方案中属于什么位置?

标签 asp.net-mvc architecture three-tier

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

我也在尝试使用存储库,而且我是代码优先的。

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

我当前的项目如下所示:

current project

这是我的问题:

  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. 关于 View 模型,例如,如果我想为客户展示产品列表,我是否需要创建 ProductViewModel , 从 ProductsBLL 获取数据其中有一个 Product 列表并将其转换为 ProductViewModel 列表然后发送给 Controller ?

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

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

最佳答案

问题一

Where are the Product and User classes that represent tables supposed to be?

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

Onion architecture overview

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

问题2

Where do I initiate the PASContext?

您通常看不到直接完成此操作的原因是因为使用 Dependency Injection 很常见。或 DI ( What is dependency injection? )

这意味着您不需要直接实例化 DbContext;你让 DI 容器为你做。在我的 MVC 应用程序中,上下文有一个 PerWebRequest lifestyle .

PerWebRequest 生活方式:

Instance of a component will be shared in scope of a single web request. The instance will be created the first time it's requested in scope of the web request.

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

问题3

do I need to create a ProductViewModel [...] ?

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

相反,将事情分开。创建单个 View 模型并将其传递给 View 。如果 View 的一部分需要显示很多内容,请让 View 将其作为子操作或部分调用,这样 View 就不会做太多事情。

您的方法:

Approach #1

另一种方法:

Approach #2

结论

If someone could show me some project that uses [...] three-tier architecture

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

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

关于asp.net-mvc - 模型在我的解决方案中属于什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590121/

相关文章:

html - 在不使用固定位置的情况下将页脚设置为页面底部。

c# - 在 C# 中表示游戏卡类的最佳方式

java - 配置应该放在哪里?

c# - 如果 MvC View 中不存在源,如何显示默认图像

asp.net-mvc - ASP.NET SimpleMembership 中密码的自定义验证

python - Python进程控制的最佳实践

architecture - REST 和 RESTful 有什么区别

c# - 三层应用架构是必要的吗?

sql - 三层架构与存储库模式

asp.net-mvc - ASP.NET MVC 模型绑定(bind)器问题