0

目前我正在重构一个巨大的单片asp.net mvc的解决方案(运行作为一个网站/门户网站),并提取类库与方法重构多门户解决方案asp.net mvc的

  1. 通用的业务逻辑(可用于创建类似的门户)
  2. 核心业务逻辑(即可以用作域逻辑)
  3. 公共储存库的逻辑
  4. 核心库逻辑
  5. 门户特定的业务逻辑(如果通用业务逻辑犯规用这种方法做)
  6. 门户库特定的逻辑(如果公共资源库的逻辑没有做的话)

的问题,因为我看到的是,在引入类似门户网站,我将有时间创建其特定的业务逻辑层 和存储库逻辑层,如果需要出现,这将增加解决方案中的项目数量(担心会变得难以管理)

如何在可管理项目方面实现多门户解决方案?

回答

1

我一直处于类似的情况,有一堆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文件夹结构:

Global sln folder structure

Web.xxxx项目都是你需要创建不同的便携式领域。即使您的MVC网站只需要用户帐户共享功能,最好将事情分开以避免需要始终部署所有内容。

这里是在Web.xxxx项目结构的一个仔细一看:

Web.xxxx project structure

便携式区域项目被称为xxxx.Area,它包含的区域的所有视图和控制器。它也有xxxxAreaRegistration.cs,它定义了该区域的路由和捆绑。

视图模型和构建器位于名为xxxx.ViewModel的单独项目中。

xxxx.Domain和xxxx.DomainModel项目是存储区域的所有服务实现和域模型的地方。 Xxxx.Data是该区域存储库实现的地方。

所有地区的服务和存储库接口都存储在合同项目中(见图#1),并可以通过特定的Nuget包单独部署。

这是我们在这里组织事物的方式的大图,如果您想要使用这种架构,请不要犹豫,如果您需要更多信息和细节。

希望有帮助!