我目前正在从事一个基于 Onion Architecture 的项目。上图显示了解决方案。
在基础设施中,我们有 External Service 。但是 WebAPI 只能访问 Core 。
但是在 Web API 项目中,我想访问外部服务公开的一些模型?我们如何在不添加对 Web API 中的 Infrastructure 的引用的情况下实现这一点。
还是我们错误地实现了洋葱架构?
我目前正在从事一个基于 Onion Architecture 的项目。上图显示了解决方案。
在基础设施中,我们有 External Service 。但是 WebAPI 只能访问 Core 。
但是在 Web API 项目中,我想访问外部服务公开的一些模型?我们如何在不添加对 Web API 中的 Infrastructure 的引用的情况下实现这一点。
还是我们错误地实现了洋葱架构?
从概念上讲,您走在正确的轨道上,但实施并不是一个硬性的快速规则。开始你不需要 5 个以上的项目,最多需要 3 个(web ui css/js/views、逻辑/控制器、代码和测试)。实际上你可能只需要 2 个(应用程序,测试)
层的概念是概念性的,而不是物理的。并且没有硬性规定必须完全隔离这些层。相反,应用程序的核心焦点是应用程序的功能。当你深入了解它是如何实现的细节时,你会移到外层。
在这种情况下,您需要访问从外部服务检索到的数据。为外部服务创建一个抽象IExternalServiceAdaptor
。接口可能驻留在域或服务器层,但实现可能驻留在基础设施或外层,其中如何调用外部服务的详细信息封装在IExternalServiceAdaptor
.
如果您坚持物理分离,您将Core
在Infrstructure
.
但是在 Web API 项目中,我想访问外部服务公开的一些模型?
实际上,您的 WebApi 项目应该只操作在您的核心项目中定义的对象。正如 Jason 所说,对任何外部服务的调用都应该封装在 Core 中的接口实现中。这就是您的外部服务公开的模型将映射到您的核心模型的地方。
在此处查看 Matt Hidinger 在 CodePlex 上的源代码:http://onionarch.codeplex.com/并查看他如何处理此类问题,它非常简单易懂。