Asp.net Web Api-每个数据库实体或每个UI屏幕的控制器

Asp.net Web Api-每个数据库实体或每个UI屏幕的控制器,asp.net,architecture,asp.net-web-api,Asp.net,Architecture,Asp.net Web Api,我在我的项目中使用WebAPI来公开数据,而这些数据又将被移动应用程序和web应用程序使用 我想知道公开数据的最佳做法是什么 例如,我有一个客户登记表,我在其中记录客户的详细信息,包括城市和国家 公开数据的一种方法是为城市和国家/地区设置单独的控制器,并在客户登记表上分别呼叫这两个控制器,以便加载城市和国家/地区的数据 这种方法的问题是,如果我必须加载100个字段,我将不得不对api进行100个不同的调用来加载数据,因此应用程序将很慢 第二种方法是设计api层,使一个控制器公开表单/屏幕(客户注

我在我的项目中使用WebAPI来公开数据,而这些数据又将被移动应用程序和web应用程序使用

我想知道公开数据的最佳做法是什么

例如,我有一个客户登记表,我在其中记录客户的详细信息,包括城市和国家

公开数据的一种方法是为城市和国家/地区设置单独的控制器,并在客户登记表上分别呼叫这两个控制器,以便加载城市和国家/地区的数据

这种方法的问题是,如果我必须加载100个字段,我将不得不对api进行100个不同的调用来加载数据,因此应用程序将很慢

第二种方法是设计api层,使一个控制器公开表单/屏幕(客户注册)所需的所有查找数据(城市、国家)。在这种情况下,我必须对api进行一次调用,以获取所有必需的数据

感觉上,使用第二种方法,我违反了关注点分离


走哪条路

您不能拆分UI和API层吗

我不认为您应该创建API来获取国家或任何其他方引用,如果它们不是您域的核心部分

我想您应该为用户注册公开
api/v1/users
资源端点,这需要一个有效的用户数据进行注册

另外,您应该公开
/users
UI,它将生成完整的UI,包括您需要的所有列表,并将其呈现给用户。此UI控制器将在内部调用您的域模型,而不是通过API来获取生成UI所需的所有详细信息。然后客户端的UI将使用用户选择的数据调用API控制器来注册用户


这是否适合您的开发模型?

我倾向于为每个实体保留一个控制器,创建尽可能少的控制器。如果需要加载10多个字段,我会移动服务器端以在视图中编译,或者在SPA的情况下,创建一个单一的控制器方法,返回表单所需的所有数据,而不是从10多个控制器请求数据。tnx@Prime03。。因此,您的意思是,在客户示例中,我们应该通过单独的控制器(城市、国家)以及另一个控制器公开数据,其中如果字段或更多字段,则返回视图的所有数据,以避免多次调用。在这种情况下,你不认为我们会重复我们自己吗?在客户示例中,如果我只需要加载城市/国家/电话类型/地址类型等。。。我将从各自的控制器加载它们。在页面上提供此数据所需的http请求数超过性能/资源阈值后,我将创建另一个方法,在单个json数组中返回所有所需数据。这完全取决于您的体系结构。您正在用一些干点换取一些性能点。艺术是平衡的。我应该注意的是,我从来没有为一张表格做过这样的事情。没错。。这就是这篇文章的重点。。我们什么时候应该考虑性能,什么时候应该考虑设计最佳实践:)很明显,您希望在任何给定页面上对页面加载进行必要的http调用。如果需要发出100个http请求,请将其合并为1或2。你的问题是“如果我必须加载100个字段”。你喜欢还是不喜欢?如果没有,请从正确封装实体(地址而不是城市和国家)的控制器开始。如果需要减少请求,请在新方法中重用现有方法以合并。如果我使用web,并且呈现UI的逻辑与配置(db user、密码)一起在服务器中,则在UI中调用/user和绑定列表将在该场景中起作用连接到数据存储并获取列表数据,但在移动应用程序中如何实现,因为理想情况下,应用程序不应该知道如何直接连接到数据存储。@ZedBee我明白了。当然,移动应用程序是有点不同的情况。在这种情况下,您可能需要以某种方式通过REST公开数据库中的所有内容。确切地说,这就是目标,设计一个REST api供不同的应用程序(如移动、web、桌面等)使用。@ZedBee No,每个REST资源的api控制器。REST实体并不总是直接映射到模型。例如,您的
支票
型号可能有
支付
方法。但在REST中,您将拥有“虚拟”
/transaction
资源,该资源在创建时表示
pay
operation.tnx。。明白了+1名在职人员:)