Asp.net web api 单一责任原则webapi

Asp.net web api 单一责任原则webapi,asp.net-web-api,solid-principles,single-responsibility-principle,Asp.net Web Api,Solid Principles,Single Responsibility Principle,我正在为一个应用程序构建一个WebAPI服务,我正处于一个十字路口,我理解这些坚实的原则,并希望按照这些原则来实现我的WebAPI服务,但是我在过去几天里一直在为实现而挣扎,希望从社区得到一些建议 单一责任原则规定,每个类都应对软件提供的功能的单一部分负责,请参见 目前我有两个ApicController,但还有更多,目前这两个控制器都有Get、Post和Put功能,但每个控制器都需要一个搜索功能,我的问题是,搜索方法是否应该移动到一个单独的ApicController中,例如称为SearchC

我正在为一个应用程序构建一个WebAPI服务,我正处于一个十字路口,我理解这些坚实的原则,并希望按照这些原则来实现我的WebAPI服务,但是我在过去几天里一直在为实现而挣扎,希望从社区得到一些建议

单一责任原则规定,每个类都应对软件提供的功能的单一部分负责,请参见

目前我有两个ApicController,但还有更多,目前这两个控制器都有Get、Post和Put功能,但每个控制器都需要一个搜索功能,我的问题是,搜索方法是否应该移动到一个单独的ApicController中,例如称为SearchController

例如:

我有一个用户控制器

public class UserController : ApiController {
    Get - returns a User
    Post and Put - Add and update a User
}
我有一个病人控制器,和上面一样,我应该在每个控制器中有我的搜索方法吗

public class SearchController : ApiController {
    SearchUsers() - returns ICollection<User>
    SearchPatients() - returns ICollection<Patient>
}

我意识到没有明确的答案,我只想就最佳实践提供一些建议

我将在各个控制器上引入搜索作为一种操作,如果您想跟踪所有具有搜索操作的控制器,请在其上设置一个界面

公共接口是可实现的 { IHttpActionResult搜索字符串q; } 公共类UsersController:ApicController,ISearchable { [路由/用户/搜索] [HttpGet] 公共IHttpActionResult搜索[FromUri]字符串q { var userRepo=新的userRepo; //此搜索方法可以根据需要进行复杂化 //搜索姓名首字母,中间名,电话号码,任何你需要的。 var results=userRepo.Searchq; 返回这个.Okresults; } } 用法:

https://domain.com/api/Users/Search?q=smith
这使您的客户非常清楚,因为他们不必知道基本上是一堆RPC的特定SearchController。如果你想一想搜索是什么,它基本上是一个动词,而不是一个标准的http动词,所以我们把它作为一个动作附加到路由上。我们仍然在处理用户集合,类似于针对集合的GET或POST。因为我们没有将搜索作为有效的HTTP方法,所以操作是次好的选择


关于固体。这使您的控制器保持简单的控制器。IMO的工作是控制请求并将其路由到逻辑。在本例中,它采用该路由,将其映射到UserRepo并执行搜索方法。搜索不是控制员的工作,你有另一个班级在做这项繁重的工作。控制器只处理给定请求应执行的逻辑。即使返回的数据也会通过序列化程序延迟到稍后的管道中,因此控制器上的SOLID应该为true。

如果您对SRP感到疯狂,并且没有找到适当的责任级别,那么大量的类将什么也不做

我认为用户控制器负责在用户资源api和如何在应用程序内部实现该概念之间进行中介。在这种情况下,将所有api操作放在一个控制器中是有意义的


也就是说,我们遵循命令/查询分离,因此我们的控制器将委托给命令或查询来完成实际工作。这样,我们的控制器应该更改的唯一原因是如果我们想更改我们提供的API

搜索可能只是一个带有过滤器的GET,对吗?不过,我假设每个命令/查询都被注入到ApiController中。这意味着每个动作可能至少使用一个动作,但其他动作中可能没有一个动作。这导致webapi控制器中充斥着依赖项,其中只有少数依赖项被使用。在这种情况下,我更希望每个方法使用一个类,并确保将它们放在一个清晰的文件夹结构中,以防止内容变得混乱。鉴于您显示的使用Url实际上使用的是查询字符串,那么parameter属性不应该是[QueryString]?@ScottK.Fraley[FromUri]正如预期的那样工作,我已经在许多WebApi项目中使用过它。我从来没有尝试过[询问],所以我必须试一试。谢谢你给我指了一些新的尝试。好的,我会的。。我一直认为[FromUri]意味着任何给定的参数都必须是Url的一部分,例如api/bla/Param1Value,并且不能处理查询字符串。谢谢你教我一些我不知道的东西!但是当然应该试一下!