c# - N 层应用程序 : Getting a model from Data layer to UI layer

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

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

数据层 -> 这是 Entity Framework 所在的位置,我使用代码优先方法,因此我拥有映射到表的模型。

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

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

MyRepo -> 包含执行 Add(MyModel model)、Save(MyModel model) 等操作的方法。

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

例如: 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 层模型映射到数据层模型,然后才能将其传递到 Controller 中的服务层,对吧?但与此同时,我不想在 Controller 中引入太多代码,也不想将其紧密耦合回数据层。

谢谢

最佳答案

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

例如:

  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处理来自数据层和业务层的映射对象属性,反之亦然。

关于c# - N 层应用程序 : Getting a model from Data layer to UI layer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29442402/

相关文章:

c# - 在多对多 Entity Framework 关系中保留外键列表

c# - 如何 : SQLite with EntityFramework and Code-First

c# - MVC5 + Microsoft 帐户 (Live ID) + IIS = redirect_uri 无效

c# - Autofac 委托(delegate)工厂,并传递容器

c# - 删除货币中的小数

asp.net-mvc - 如何从 ASP.NET MVC 中的 View 中找出当前资源和 Controller 名称

javascript - 将 Date 对象从 javascript 传递到 asp.net mvc Controller

c# - 如何为帖子添加标签?

c# - 为什么短路运算符不是默认值

c# - 在枚举中使用字符串