我一直处于类似的情况,有一堆MVC站点共享许多常用功能。
我们所做的首先是在一个单独的解决方案(我们称之为“全局”)中隔离所有这些常见的东西。该解决方案的结构与所有MVC站点几乎相同,并且包含“全局”特定业务逻辑,接口,实体,存储库和UI组件(即:页眉和页脚,登录功能等)。这些常见的功能组织在portables areas中,只要您在其中一个MVC站点中需要其中的一个,就可以使用专用的Nuget包进行部署。
为了能够测试我们开发的所有便携式领域,无需部署它们,我们在Global sln中创建了一个“启动器”站点。这个网站从未被部署;它仅为测试目的而构建。
我们的MVC架构不是常见的n层架构,而是Onion架构。如果你有兴趣,请看看所有related StackOverflow questions。我们所有的MVC站点都在使用StructureMap DI,以便在启动时将我们使用的所有接口与正确的实现绑定。全球拥有自己的DI容器配置部分。其中StructureMap结合所有
GlobalConfig.Init();
GlobalConfig.RegisterAllAreas();
Init方法是:你必须做的事情正确运行的唯一的事情,就是调用MVC网站的Global.asax文件中的这2种方法该主机的便携领域接口与正确的实现和RegisterAllAreas方法注册便携式区域路由和捆绑。这两个方法必须在MVC站点自己的路由,绑定和DI之前注册。
这里是全球SLN文件夹结构:
Web.xxxx项目都是你需要创建不同的便携式领域。即使您的MVC网站只需要用户帐户共享功能,最好将事情分开以避免需要始终部署所有内容。
这里是在Web.xxxx项目结构的一个仔细一看:
便携式区域项目被称为xxxx.Area,它包含的区域的所有视图和控制器。它也有xxxxAreaRegistration.cs,它定义了该区域的路由和捆绑。
视图模型和构建器位于名为xxxx.ViewModel的单独项目中。
xxxx.Domain和xxxx.DomainModel项目是存储区域的所有服务实现和域模型的地方。 Xxxx.Data是该区域存储库实现的地方。
所有地区的服务和存储库接口都存储在合同项目中(见图#1),并可以通过特定的Nuget包单独部署。
这是我们在这里组织事物的方式的大图,如果您想要使用这种架构,请不要犹豫,如果您需要更多信息和细节。
希望有帮助!