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

问题描述:

所以我坚持这个项目,我正在努力让体系结构正确完成。我正在使用MVC和实体框架,我决定使用n层模型将我的应用程序布置到图层中。所以我有以下几点:N层应用程序:从数据层到UI层获取模型

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

我也有返回这些模型库(数据访问)etc.For例如:

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

MyRepo - >包含该方法像添加(MyModel模型),保存(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层模型映射到数据层模型,然后才能将其传递到控制器中的服务层?但同样的事情,我不想在控制器中引入太多的代码,而且我也不想将它紧密地耦合到数据层。

感谢

+0

“类别”的字符串列表甚至来自哪里?所示结构在多重性上似乎相互冲突。 – user2864740 2015-04-04 03:39:16

+0

哦,这是模型(字符串列表,应该更像是选择列表),我打算传递给视图,这是否有道理?我正确地做了吗? – fancycoconut 2015-04-04 03:47:05

我的做法是建立在服务层的商业模型,模仿你的数据库模型。

例如:

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

无论如何,可以使用AutoMapper从数据层和业务层或正相反处理映射对象属性。

+0

啊我看到了,这种方式UI取决于服务层。那意味着我必须保持两种不同的型号? – fancycoconut 2015-04-04 03:48:30

+0

Yups拥有单独的业务模型和数据模型,当您需要更改模型的某个部分时,可以为您提供更多的灵活性。 – 2015-04-04 05:14:04