N层应用程序:从数据层到UI层获取模型

时间:2015-04-04 03:26:55

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

所以我一直坚持我正在努力完成这个项目,我试图让这个架构正确完成。我使用MVC和Entity Framework,我决定使用n层模型将我的应用程序分层。所以我有以下内容:

数据层 - >这是实体框架所在的位置,我使用代码优先方法,所以我有映射到表的模型。

我还有返回这些模型的存储库(数据访问)等。例如:

MyModel - >包含映射到数据库表的属性

MyRepo - >包含执行Add(MyModel模型),Save(MyModel模型)等方法。

服务层 - >这是我打算保留所有业务逻辑的地方,这个层引用了数据层,我可以在这里传递模型。

例如: MakePurchase(MyModel模型),可以在这里获取MyModel对象,因为服务层引用/取决于数据层

UI图层 - >这是使用MVC的前端,所以我的问题是如何从数据层获取模型到这里而不引用它或依赖它?理想情况下,我只希望它依赖于服务层,因为如果UI层也依赖于数据层,那么它是不是紧密耦合?这是否意味着我必须从UI中的数据层维护相同的模型集?另外,前端的模型也与数据层中的模型不同,例如:

数据层模型类似于:

    MyModel
    {
        public int Id;
        public int Name;
        public int CategoryId;
     }

而前端的模型类似于:

    MyModel
    {
         public int Id;
         public int Name;
         public int CategoryId;

         public List<String> Categories; // Which I could use to populate a dropdown box
     }

我希望这有道理吗?所以我在数据层和UI层的不同模型之间停留,因为我必须将UI层模型映射到数据层模型才能将其传递到控制器中的服务层吗?但同样的事情是我不想在我的控制器中引入太多代码,我不想将它紧紧地耦合到数据层。

由于

1 个答案:

答案 0 :(得分:3)

我的方法是在服务层创建一个模仿数据库模型的业务模型。

例如:

  1. 在您的数据层中,您有课程

    class MyModel
    {
        public int Id;
        public int Name;
        public int CategoryId;
    }
    
  2. 然后在您的业务层中,创建一个模仿MyModel的类。

     class MyModelB
     {
        public int Id;
        public int Name;
        public int CategoryId;
        public List<String> Categories;
     } 
    
  3. 添加新数据时,UI图层将创建MyModelB个对象。然后在您的服务层中将其转换为MyModel对象。

    // service layer
    public void Add(MyModelB model)
    {
        MyModel obj = new MyModel();
        obj.Id = model.Id;
        obj.Name = model.Name;
        obj.CategoryId = model.CategoryId;
    
        MyModelRepository r = new MyModelRepository ();
        r.Add(obj);
    }
    
  4. 从数据库获取数据时,在将对象从服务层返回到UI层之前将其转换为业务模型。

    // service layer
    public MyModelB GetMyModelById(int id)
    {
        MyModelRepository r = new MyModelRepository ();
        MyModel model = r.GetMyModelById(id);
        if(model != null) 
        {
                MyModelB obj = new MyModelB();
                obj.Id = model.Id;
                obj.Name = model.Name;
                obj.CategoryId = model.CategoryId;
        } 
        else return null;
      }
    
  5. 无论如何,您可以使用AutoMapper来处理数据层和业务层的映射对象属性,反之亦然。