N层ASP.NET MVC应用程序中的视图模型位置

3

我已经阅读了这篇文章,并对此感到疑惑。

我的应用程序包含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。我读过自动映射器,但它是否处理这种情况?如果是,那么怎么做呢?

目前,我已经决定将VMs移动到实体层,该层将连接所有三个层,以便我可以在同一位置发送和接收数据,有其他好的想法吗?

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

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

                   }

                    return View("Index");
            }

在BLL中使用类似的Automapper技术,在DAL中也需要类似的操作。
    public int BLLfunction(CompanyVMIndex CompanyVM)
    {

    }

现在,由于BLL没有CompanyVMIndex的定义(它是一个VM),我该如何传递数据到Web UI中?


为视图模型创建一个单独的类库,这将有助于完善你的架构。同时也有助于保持各层专注于它们所做的事情。 - Dhrumil
把它放在实体层怎么样? - Mohammed Dawood Ansari
请看约翰的回答。那是一个很好的方法,类似于我所说的。 - Dhrumil
主要问题是如何将数据从UI传递到BLL仍然没有得到解答。我已经编辑了问题以便更好地理解。 - Mohammed Dawood Ansari
你好,以下是編程相關內容的中文翻譯:你表現得好像不同的層有什麼特別之處。它們由類組成,這些類有方法。通過調用這些方法來傳遞數據。 - John Saunders
显示剩余2条评论
1个回答

5
如果您想要“纯净”架构,那么ViewModel(或者一般情况下您发送到视图的任何模型)将不会被BLL或其他层看到。 它只能用于控制器和视图之间的通信。
当从BLL检索数据或向BLL发送数据时,使用其他类。 数据将复制到和从ViewModel类中复制出来。
这样,ViewModel包含了控制器与视图通信所需的内容,以及视图与控制器通信所需的内容。 BLL可以用于业务逻辑,并且可能使用与任何ViewModel都不完全对应的类。
例如,ViewModel可以包含关于客户及其公司的信息以及客户过去3个月已订购产品的信息。 它还可以包含其他数据,用于在视图中创建用户界面元素:例如,运输方式列表。 这些数据几乎肯定来自多个不同的BLL类和方法。 这些数据的形状是针对视图和控制器之间的通信而设计的。 BLL类则针对业务逻辑和可能的数据库进行设计。

1
你在问什么?BLL只是一堆类,带有数据和方法。通过调用方法,您可以从UI向BLL传递数据。 - John Saunders
1
你永远不要将ViewModel传递给BLL。你的ViewModel将包含一些数据片段,你可能想要传递给BLL。但是你绝不会将表示层类传递给BLL。 - John Saunders
那么我该如何传递从用户那里获取的数据呢? - Mohammed Dawood Ansari
1
我觉得我们不是在说英语。如果用户输入数字1,它将存储在 MyViewModel.NumberFromUser 中。然后,您可以通过调用 BLL.DoSomethingWithNumber(myViewModel.NumberFromUser) 将其传递给 BLL。 - John Saunders
1
尽管这个线程已经过时了,但我想为讨论增加一些意义。完全同意@John所说的。您的VM可以有5个字段。您将其中3个传递给BLL类中的一个函数,另外2个传递给另一个函数。如何传递是使用Automapper。有关参考,请参见https://www.codeproject.com/Articles/639618/CRUD-Opearations-using-AutoMapper-in-an-MVC-Applic - aditya
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接