这是我第一次使用 MVC 做 web 项目,我试图基于三个层来制作它:MVC、DAL(数据访问层)和 BLL(业务逻辑层)。
我也在尝试使用存储库,而且我是代码优先的。
无论如何,我已经在网上搜索了很多,但如果您对我有很好的引用,我会很高兴看到它。
我当前的项目如下所示:
这是我的问题:
代表表的 Product 和 User 类应该在哪里?看来我需要在 BLL 中使用它们,而在 DAL 中我并不需要它们,但对于
PASContext
.我在哪里启动
PASContext
?在我在互联网上看到的所有示例中,没有人在存储库中创建一个采用 0 参数的构造函数,这意味着上下文不是在存储库中创建的(而且我已经阅读了一些原因,为什么所有存储库都会这样使用一个上下文)。
如果我尝试启动 PASContext
在ProductBLL
编译器说它无法识别它并且我缺少一个引用(尽管我已经添加了所需的引用并且名称 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();
}
- 关于 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的情况下模型属于解决方案的核心。
在你的情况下,我会把它们放在 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 就不会做太多事情。
您的方法:
另一种方法:
结论
If someone could show me some project that uses [...] three-tier architecture
我不确定三层架构。以下是一些使用各种解决方案架构的示例项目:
没有单一的正确方法 - 只有好的和坏的方法。
关于asp.net-mvc - 模型在我的解决方案中属于什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590121/