Web API 的全部意义在于成为一个无状态的 RESTful 服务。如果你做得对,就永远不会有这样的例子。我意识到这个问题很老,您可能已经亲自了解了这一点,但是对于您来说,答案并不像对常见问题的回答那样多。
请注意,当谈到 Web API 时,人们通常在谈论 ApiControllers 而不是基本的 MVC“控制器”,它们采用路由并将它们转换为视图。
因此,在您的项目中,您可能有一些“控制器”,它们执行一些基本的视图逻辑,但没有业务逻辑。不要将其与您的服务层混淆,后者是您的业务逻辑和持久性访问的包装器。
我和许多人认为 ApiControllers 不应该与您的 MVC 应用程序混合使用。请记住,MVC 不能与 Web API 很好地混合。正如菲利普 W 所说:
Web API 和 MVC 使用的许多概念,尽管乍一看很相似,但实际上并不兼容。例如,Web API 属性是 System.Web.Http.Filters.Filter 和 MVC 属性是 System.Web.Mvc.Filter - 它们是不可互换的。
最灵活的答案
所以你要做的是创建一个名为 api.YourWebsite.com 的子域,并在那里构建一个新的 Web API ApiController 项目。该 Web API 项目应该做的只是通过 ApiControllers 和依赖注入实例化和公开业务逻辑。
备选方案 1
面向服务的架构是关于可重用性的。如果您想保持您的应用程序 DRY,那么您绝对应该使用 SOA。虽然,每种情况都不同。如果您永远不会在本网站的任何其他应用程序(桌面、安卓、平板电脑、ewPhones 等)中使用相同的业务逻辑,那么您有另一种方法。
将您的业务逻辑层创建为不同的项目,并直接从您的 Web 应用程序访问它。当您的 Javascript(Angular/Razor?)控制器进行调用时,它们可以调用您的 ViewModel 和/或 Codebehind 或类似的东西,它们可以实例化业务逻辑并直接访问它。如果一切都在那里并且不会被重用,则不需要服务。
备选方案 2
继续,将您的 Web API ApiControllers 放在同一个项目中。但是,请确保将它们与 MVC“控制器”分开到不同的文件夹中。尽管如此,当您的 Javascript 控制器进行调用时,它们仍将对您的网站进行路由调用以进行无状态返回。不要将无状态 ApiController 与您的 ViewModel 和其他 MVC 代码混合使用。
这样做的缺点是缺少 SOC。现在您已经混合了服务层和 UI 层,并且您的 UI 层被迫访问您的业务逻辑层 (DLL)。如果备选方案 1 做到了,那有什么问题?
好吧,问题在于备选方案 1 是一个没有增长空间的小型应用程序。其他任何东西(原始计划,或此处的备选方案 2)都应该具有不知道业务逻辑(或持久性)是否存在的 UI。他们应该在不知道后端世界的情况下做他们的小事。