Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无需多个并行对象模型的MVC/EF系统设计_C#_Asp.net Mvc_Entity Framework_Oop_Model - Fatal编程技术网

C# 无需多个并行对象模型的MVC/EF系统设计

C# 无需多个并行对象模型的MVC/EF系统设计,c#,asp.net-mvc,entity-framework,oop,model,C#,Asp.net Mvc,Entity Framework,Oop,Model,我正在设计一个相当大的系统来管理数据存储库,并通过各种媒体向用户提供数据。为了便于讨论,让我们假设它是一个大的小部件和订单目录。我发现这个设计有一点不令人满意,那就是我发现自己在系统的不同部分有很多并行但不同的对象模型,还有很多代码来管理和相互转换它们 更具体地说,到目前为止,我们至少有以下几点: 实体框架域模型。这是所有真相的来源,以及存储在数据库中的内容。这里的小部件了解小部件的一切。虽然它是一个代码优先的POCO模型,但EF确实对需要定义哪些属性才能使模型正常工作施加了某些约束。(在我看来

我正在设计一个相当大的系统来管理数据存储库,并通过各种媒体向用户提供数据。为了便于讨论,让我们假设它是一个大的小部件和订单目录。我发现这个设计有一点不令人满意,那就是我发现自己在系统的不同部分有很多并行但不同的对象模型,还有很多代码来管理和相互转换它们

更具体地说,到目前为止,我们至少有以下几点:

  • 实体框架域模型。这是所有真相的来源,以及存储在数据库中的内容。这里的
    小部件
    了解小部件的一切。虽然它是一个代码优先的POCO模型,但EF确实对需要定义哪些属性才能使模型正常工作施加了某些约束。(在我看来,试图省略外键ID只会导致痛苦。)

  • 查看管理员web应用程序的模型。大多数显示视图只能使用域对象。但不是每个属性都应该直接可编辑,有些属性必须以不同于存储的形式进行编辑,等等

  • 用于一组本地移动应用程序使用的web API的一组DTO。这里的重点是a)提供(仅)应用程序需要的信息,以及b)定义序列化过程中产生的JSON的形状。输出并不总是与域模型一一对应

  • 我们还正在开发一个并行的web API,通过它,我们的原始设备制造商可以查看和管理他们自己的小部件。这些要求与面向移动的API或内部管理站点不同,因此此API为
    小部件
    或我们的零件订单公开的数据集不会100%匹配

  • 移动的都是相同的概念实体,但系统的不同部分与它们的交互方式不同,或者与它们的不同方面交互。添加一个新字段,或者更改验证逻辑,或者类似的事情,都可能需要在不同的名称空间中接触一大堆不同的
    小部件
    类,并调整翻译代码。概念上不难,但繁琐且容易出错

    即使我们对使用与呈现视图和管理序列化相关的属性来装饰域模型没有审美上的异议,一个实体通常有多个视图集,或者多个API,因此没有一组编码指令

    作为一个天性要求系统化和简化事物的人,坦率地说,这一切都让我感到厌烦。闻起来很难闻。我无法逃避这样一种感觉:我肯定错过了什么,必须有更好/更干净的方法来处理这件事

    有什么样的策略和工具可以缓解(或自动化?)这种蔓延?还是这种重复不可避免?


    我是否在以这种系统组合的方式与框架抗争?

    我认为总体而言,拥有独立的视图模型和DTO是一个好主意。他们每个人都有各自的责任。域对象与各种模型和DTO之间的映射可能是一个真正的难题,因此我建议使用AutoMapper之类的工具来处理这个问题