在N Tier ASP .NET MVC应用程序中查看模型位置

时间:2015-06-12 06:39:48

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

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

我的应用包含4个图层

  1. Web项目/ UI
  2. BLL
  3. DAL(包含EF)
  4. 实体层
  5. 到目前为止,我已将VM放置在UI层中,并且它是不同类的组合。像这样的东西

     public static void main(String[] args) {
    
    
        try {
            getToken();
            Thread.sleep(10000);
        } catch (Exception e) {
    
            e.printStackTrace();
        }
    
    
        final Timer timer = new Timer();
        Timer stopTaskTimer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                try {
                    /*getToken();
    
                    Thread.sleep(15000);*/
                    getResponse("#############");
    
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        TimerTask stopTask = new TimerTask() {
            @Override
            public void run() {
                timer.cancel();
    
            }
        };
    
        timer.scheduleAtFixedRate(task, 0, 60000);
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = sdf.parse("2015-06-20 19:41:30");
            //stopTaskTimer.schedule(stopTask, date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    
    }
    

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

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

        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; }
        }
    

    然后在BLL和类似的DAL与Automapper

                 public ActionResult Create(CompanyVMIndex companyVM)
                 {
                   if (ModelState.IsValid)
                      {
                         //Calling BLL here
                         BLLFunction(companyVM)
    
                       }
    
                        return View("Index");
                }
    

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

1 个答案:

答案 0 :(得分:4)

如果您想成为纯粹的#34;,那么您的BLL或任何其他图层将永远不会看到ViewModel(或者,通常,您发送给视图的任何模型)。它只会用于控制器和视图之间的通信。

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

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

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