C# 如何将查询字符串参数从WebAPI传递到业务层?

C# 如何将查询字符串参数从WebAPI传递到业务层?,c#,.net,asp.net-web-api,asp.net-web-api2,C#,.net,Asp.net Web Api,Asp.net Web Api2,Project向外部客户端公开WebAPI,它们将在查询字符串中嵌入多个参数值,并且该查询字符串数据将存储在数据库中 问题 我愚蠢的问题是如何将查询字符串值从WebAPI操作传递到业务层 我可以想出两种方法: 1.将完整的请求对象传递给业务层。 2.将查询字符串参数转换为列表或数组,并将该列表/数组传递给业务层 你认为传递请求是系统上的过度杀伤或错误攻击。我只是在想,就大小而言,它可能是一个很重的物体 如果我转换查询字符串参数,我是在做违背开发良好实践或Microsoft建议的事情吗 非常感谢您

Project向外部客户端公开WebAPI,它们将在查询字符串中嵌入多个参数值,并且该查询字符串数据将存储在数据库中

问题 我愚蠢的问题是如何将查询字符串值从WebAPI操作传递到业务层

我可以想出两种方法: 1.将完整的请求对象传递给业务层。 2.将查询字符串参数转换为列表或数组,并将该列表/数组传递给业务层

你认为传递请求是系统上的过度杀伤或错误攻击。我只是在想,就大小而言,它可能是一个很重的物体

如果我转换查询字符串参数,我是在做违背开发良好实践或Microsoft建议的事情吗


非常感谢您的指导。

业务层应该独立于调用它的层。如果您将整个请求对象传递到业务层,那么您将业务层与WebAPI紧密耦合,这被认为是一个复杂的过程。考虑另一个场景:如果要从控制台应用程序或windows服务调用同一业务层,该怎么办?当然,您不希望仅仅为了调用业务层而在那里构建一个完整的请求对象

由于您有一个从WebAPI到业务层的引用,您应该在业务层上定义一个参数对象。因此,您的业务层可以使用它作为参数,WebAPI可以在根据接收到的请求填充该参数后在方法调用中提供该参数。这促进了松散耦合,使您的业务层能够在不影响WebAPI层的情况下进行更改,反之亦然


还考虑在WebAPI层中处理异常,因为这是一个可以返回正确的HTTP状态代码的地方,即当找不到请求的对象时没有发现404。

您可能会认为这是多余的,但是我遵循了Jimmy Bogard在描述他的MyIATR库时写的一些指导:

要点是将传入的请求映射到DTO对象(通常是简单的数据类),并使用管道将它们下放到业务层。这要求您映射请求对象,但在API的关注点(由WebAPI处理)和业务域的关注点(当然由您自己的代码处理)之间提供了非常清晰的分离


我一直在基于制造的API中使用这种方法,并取得了非常积极的结果。

我建议不要传递请求对象。这迫使您的业务层依赖于
System.Web.Http
,您应该尽可能避免这种依赖。@trnelson非常感谢您的观点。就良好实践而言,将数据从请求传输到对象并发送到业务层可以吗?一般来说,我认为服务应该只公开业务层,并且应该在业务层中包含所有内容(逻辑)?@trnelson WebAPI是否会自动将查询字符串参数转换为对象或JSON/XML?或者我需要手动操作?请指导。使用自定义对象(通常是DTO-数据传输对象)从API层向BL发送数据是完全可以的。有时被称为编排模式或服务层,在这种情况下,您的业务层不应该了解web,除非在某些情况下。Web API将查询字符串参数转换为类型化变量(
int,string
,等等),这取决于您是将它们传递到BL方法中,还是将DTO组合到对象中并传递它们。一般来说,后者是最有意义的,但就像软件开发中的所有事情一样,这取决于。