【问题标题】:View Model place in N Tier ASP .NET MVC application在 N 层 ASP .NET MVC 应用程序中查看模型位置
【发布时间】:2015-08-28 02:13:21
【问题描述】:

我已阅读 this 并对此感到疑惑。

我的应用程序包含 4 层

  1. Web 项目/用户界面
  2. BLL
  3. DAL(包含 EF)
  4. 实体层

到目前为止,我已将 VM 放置在 UI 层中,它是不同类的组合。像这样的

    public class CompanyVMIndex
    {
       public CompanyVM Company { get; set; }
       public BillingAddressVM BillingAddress { get; set; }
       public List<ShippingAddressVM> ShippingAddress { get; set; }
       public List<CompanyContactVM> CompanyContact { get; set; }
    }

我现在很困惑如何将这些数据从 UI 发送到 BLL,然后再发送到 DAL。我已经阅读了 automapper 但它是否处理这种情况,如果是,那么如何处理? 截至目前,我决定将虚拟机移动到实体层,实体层将连接到所有三层,以便我可以在同一层发送和接收数据, 还有什么好主意吗?

这就是我将数据从 UI 传递到 BLL 的方式

             public ActionResult Create(CompanyVMIndex companyVM)
             {
               if (ModelState.IsValid)
                  {
                     //Calling BLL here
                     BLLFunction(companyVM)

                   }

                    return View("Index");
            }

然后在 BLL 中,在 DAL 中使用 Automapper 进行类似的操作

    public int BLLfunction(CompanyVMIndex CompanyVM)
    {

    }

现在,我如何传递数据,因为 BLL 没有 CompanyVMIndex 的定义,它是一个 VM 和 Web UI

【问题讨论】:

  • 为视图模型创建一个单独的类库。那将是对您的架构的补充。也将有助于保持所有层特定于他们的工作。
  • 把它放在实体层怎么样?
  • 嗯,你可以。但这会将两种不同的东西混合到一层中。如果您将图层分开,您可以根据需要提供对其他图层的引用。
  • 这会将两种不同的东西混合到一层中??我不太清楚。实际上,我已经为这种情况创建了实体层;当我想从 UI、BLL 和 DAL 访问某些东西时,它们都可以有实体层的引用,这样我就可以防止直接从 UI 访问 DAL,UI 必须通过 BLL 或实体层。
  • 见下面约翰的回答。这是一个很好的方法,与我所说的类似。

标签: c# asp.net-mvc entity-framework viewmodel n-tier-architecture


【解决方案1】:

如果您想要“纯粹”,那么您的 BLL 或任何其他层将永远不会看到 ViewModel(或者,一般来说,您发送到视图的任何模型)。它只会用于控制器和视图之间的通信。

当需要从 BLL 检索数据或将数据发送回 BLL 时,将使用其他类。数据将被复制到 ViewModel 类和从 ViewModel 类复制。

这样,ViewModel 准确地包含控制器与视图通信所需的内容,以及视图与控制器通信所需的准确信息。 BLL 可以是关于业务逻辑的,并且可能使用与任何 ViewModel 不完全对应的类。

例如,ViewModel 可能包含有关客户及其公司的信息,以及有关客户在过去 3 个月内订购的产品的信息。它还可能包含用于在视图中创建用户界面元素的其他数据:例如,运输方式列表。这些数据几乎可以肯定来自几个不同的 BLL 类和方法。此数据的形状面向视图和控制器之间的通信。 BLL 类面向业务逻辑,也可能面向数据库。

【讨论】:

  • 同意,但现在的问题是,如何将数据从 UI 传递到 BLL。我是否需要在 BLL 中创建相同类的副本。
  • 你在问什么? BLL 只是一堆类,包含数据和方法。您通过调用方法将数据从 UI 传递到 BLL。
  • 您不会将 ViewModel 传递给 BLL - 永远。您的 ViewModel 将包含一些您可能希望传递给 BLL 的数据。但是您从不将表示层类传递给 BLL。
  • 我认为我们都不会说英语。如果你从用户那里得到数字 1 怎么办。它存储在MyViewModel.NumberFromUser 中。然后你可以通过调用BLL.DoSomethingWithNumber(myViewModel.NumberFromUser)将它传递给BLL。
  • 尽管这个帖子很旧,但我想为讨论添加一些意义。完全同意@John 所说的。您的 VM 可以有 5 个字段。您将其中的 3 个传递给 BLL 类中的一个函数,将 2 个传递给另一个函数。你如何通过是使用Automapper。一些参考见codeproject.com/Articles/639618/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多