1.为什么要做分层?

请先看项目分层的最后结构:

2.设计的初衷

  1. 项目较大,且主题鲜明,分为:BI模块、DM-用户洞察模块、Manage-应用管理模块、Report应用分析报表模块,大模块之间并无依赖关系。

  2. 部分功能模块因为代码存量很大,采用的是JQuery+Razor+MVC的技术栈,而现行的WebApi+Vue单页面应用与之技术栈不同,所以不放在同一个工程中并存使用,而是直接搬移旧代码,做CSS样式替换和权限控制。

  3. 为什么不通过SSO拆开独立子站点部署?体量不大,无需增大成本,以后如体量增大,大模块也可通过新增Web.Host工程单独部署。

3.稍微了解一下MVC的控制器寻找注册机制

https://www.cnblogs.com/gucaocao/p/8422889.html 看这个即可。

4.开始分离项目

如果是Core项目,则无需麻烦,会自动成功,但是在NetFramework4.6下,会出现找不到控制器问题。

解决方案1:

以:SD_Game分割,可看截图。

在SD_Game.Web.Host工程文件中的WebHostModule.cs文件为ApplicationParts添加Assembly。


  1. public override void Initialize()
  2. {
  3. IocManager.RegisterAssemblyByConvention(typeof(DMWebHostModule).GetAssembly());
  4. var partManager = IocManager.Resolve<ApplicationPartManager>();
  5. //分离类库里的任意类。
  6. var type = typeof(BIApiController);
  7. var assembly = type.Assembly;
  8. //判断是否存在
  9. if (!partManager.ApplicationParts.Any(o => o.Name == type.Namespace))
  10. {
  11. //添加分离类库的程序集
  12. partManager.ApplicationParts.Add(new AssemblyPart(assembly));
  13. }
  14. }
  15. }
解决方案2:
  1. 在分离的项目中引入ABP,新建ReportWebCoreMudule.cs
  1. [DependsOn(
  2. typeof(ReportApplicationModule),
  3. typeof(AbpAspNetCoreModule)
  4. )]
  5. public class ReportWebCoreMudule : AbpModule
  6. {
  7. private readonly IHostingEnvironment _env;
  8. private readonly IConfigurationRoot _appConfiguration;
  9. public ReportWebCoreMudule(IHostingEnvironment env)
  10. {
  11. _env = env;
  12. _appConfiguration = AppConfigurations.Get(env.ContentRootPath, env.EnvironmentName, env.IsDevelopment());
  13. }
  14. public override void PostInitialize()
  15. {
  16. }
  17. public override void PreInitialize()
  18. {
  19. //把工程根目录Razor文件夹添加到嵌入资源
  20. Configuration.EmbeddedResources.Sources.Add(
  21. new EmbeddedResourceSet(
  22. "/Views/",
  23. typeof(ReportWebCoreMudule).GetAssembly(),
  24. //这里需要注意:为项目的默认命名空间+文件夹路径,这个SD_Game.Report.Web.Core项目的默认命名空间为:SD_Game.Report,并非SD_Game.Report.Web.Core,因为我修改了。
  25. "SD_Game.Report.Views"
  26. )
  27. );
  28. //把工程Area目录下的文件夹添加到嵌入资源
  29. Configuration.EmbeddedResources.Sources.Add(
  30. new EmbeddedResourceSet(
  31. "/Areas/Report/Views/",
  32. typeof(ReportWebCoreMudule).GetAssembly(),
  33. "SD_Game.Report.Areas.Report.Views"
  34. )
  35. );
  36. //动态路由的注入,即IApplicationServices的实现类注入。
  37. Configuration.Modules.AbpAspNetCore()
  38. .CreateControllersForAppServices(
  39. typeof(ReportApplicationModule).GetAssembly(), "report"
  40. );
  41. }
  42. public override void Initialize()
  43. {
  44. var assembly = typeof(ReportWebCoreMudule).GetAssembly();
  45. IocManager.RegisterAssemblyByConvention(assembly);
  46. var partManager = IocManager.Resolve<ApplicationPartManager>();
  47. if (!partManager.ApplicationParts.Any(o => o.Name == assembly.FullName))
  48. {
  49. partManager.ApplicationParts.Add(new AssemblyPart(assembly));
  50. }
  51. }
  52. }

2.修改SD_Game.Web.Host工程文件中的WebHostModule.cs文件

  1. [DependsOn(
  2. typeof(ManageWebCoreMudule),
  3. //依赖创建的模块,其他都不用修改
  4. typeof(ReportWebCoreMudule),
  5. typeof(BIWebCoreMudule),
  6. typeof(DMWebCoreModule)
  7. )]
  8. public class DMWebHostModule : AbpModule
  9. {
  10. ...
  11. }

此时Controller均可以找到,但是分离在类库中的Razor文件会找不到。

解决方案:

修改:SD_Game.Report.Web.Core.csproj

  1. <ItemGroup>
  2. <EmbeddedResource Include="Views\**\*.cshtml" />
  3. <EmbeddedResource Include="Areas\Report\Views\**\*.cshtml" />
  4. </ItemGroup>

此时,项目分离以及完成! 但是!在发布的时候,打开子模块的Razor页面,会报错:

  1. System.InvalidOperationException: Cannot find reference assembly 'Microsoft.Win32.Primitives.dll' file for package Microsoft.Win32.Primitives
  2. Microsoft.Extensions.DependencyModel.Resolution.ReferenceAssemblyPathResolver.TryResolveAssemblyPaths(CompilationLibrary library, List`1 assemblies)
  3. 在 Microsoft.Extensions.DependencyModel.Resolution.CompositeCompilationAssemblyResolver.TryResolveAssemblyPaths(CompilationLibrary library, List`1 assemblies)
  4. Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths(ICompilationAssemblyResolver resolver, List`1 assemblies)
  5. 在 Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths()
  6. 在 Microsoft.AspNetCore.Mvc.ApplicationParts.AssemblyPart.<>c.<GetReferencePaths>b__8_0(CompilationLibrary library)
  7. 在 System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
  8. Microsoft.AspNetCore.Mvc.Razor.Compilation.MetadataReferenceFeatureProvider.PopulateFeature(IEnumerable`1 parts, MetadataReferenceFeature feature)
  9. 在 Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager.PopulateFeature[TFeature](TFeature feature)
  10. 在 Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorReferenceManager.GetCompilationReferences()
  11. 在 System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory)
  12. Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorReferenceManager.get_CompilationReferences()
  13. Microsoft.AspNetCore.Mvc.Razor.Internal.LazyMetadataReferenceFeature.get_References()
  14. Microsoft.CodeAnalysis.Razor.CompilationTagHelperFeature.GetDescriptors()
  15. Microsoft.AspNetCore.Razor.Language.DefaultRazorTagHelperBinderPhase.ExecuteCore(RazorCodeDocument codeDocument)
  16. Microsoft.AspNetCore.Razor.Language.RazorEnginePhaseBase.Execute(RazorCodeDocument codeDocument)
  17. Microsoft.AspNetCore.Razor.Language.DefaultRazorEngine.Process(RazorCodeDocument document)
  18. Microsoft.AspNetCore.Razor.Language.DefaultRazorProjectEngine.ProcessCore(RazorCodeDo
解决方案:

修改: SD_Game.Web.Host.csproj

  1. 新增:
  2. <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>

修改: SD_Game.Report.Web.Core.csproj

  1. <RazorCompileOnPublish>true</RazorCompileOnPublish>
  2. <RazorCompileOnBuild>true</RazorCompileOnBuild>
OK,完成项目剥离。

abp项目如何按业务功能模块横向分割?的更多相关文章

  1. Abp Zero——前端如何新增功能模块

    为适应不同开发人员,abp rezo的UI实现了spa和mpa两套: spa--Single-page Application(单页面应用),默认"http://localhost/Acco ...

  2. springboot项目整合-注册功能模块开发

    工程简介 准备工作:项目所用到的html界面以及sql文件链接如下:链接: https://pan.baidu.com/s/18loHJiKRC6FI6XkoANMSJg?pwd=nkz2 提取码: ...

  3. 文件一键上传、汉字转拼音、excel文件上传下载功能模块的实现

    ----------------------------------------------------------------------------------------------[版权申明: ...

  4. CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档……

    功能模块.业务架构.需求分析.用户需求.系统分析.功能设计.详细设计.文档.业务.技术--很多被随口使用的名词,其实是含糊甚至错误的. 到底含糊在哪里,错误在哪里,不仅仅是新手软件开发人员糊涂,许多入 ...

  5. 关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法

    关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法 1. 找到以下路径 ...\Kingdee\K3ERP\KDHR\SITEFILE\WEBUI\ 找到“Login.aspx” ...

  6. OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能

    OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...

  7. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  8. ABP项目概述

    在系统性介绍整个ABP框架之前,我们首先需要对ABP框架有一个大概的了解,ABP框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目)顾名思义就是能够通过 ...

  9. Castle Windsor常用介绍以及其在ABP项目的应用介绍

    最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...

随机推荐

  1. MVC 之 架构的基本原理及Asp.Net实现MVC

    一.引言 许多Web应用都是从数据存储中检索数据并将其显示给用户.在用户更改数据之后,系统再将更新内容存储到数据存储中.因为关键的信息流发生在数据存储和用户界面之间,所以很多应用将数据和用户界面这两部 ...

  2. php文件上传接口及文件上传错误服务器配置

    一:上传表单 <form enctype="multipart/form-data" action="doFileUp.php" method=" ...

  3. 模块化开发RequireJS之shim配置

    一.shim requirejs使用AMD规范开发,若开发过程中加载非AMD规范js,需要使用requirejs的shim进行配置. shim配置语法为: //配置文件 requirejs.confi ...

  4. 【BIEE】MDS-01377:无法从使用 JNDI 名称 “jdbc/mds/owsm” 配置的数据源获取数据库连接

    这是一次意外关机情况,BIEE环境是window server2008,但是一次意外情况,BIEE自动关机了,造成开启成功新启动BIEE产生如下错误: 错误产生后,倒腾了半天,并没发现什么问题,只是通 ...

  5. Oracle 导入导出SQL 查看登录用户表个数

    导出 : --注意结尾不能加分号; 导入 IMP HLMARKET/HLMARKET@192.168.1.22:1521/orcl file=e:/db/HLMARKET_20150729.dmp f ...

  6. 图解Java机制

    一图胜过千万言!希望本文能帮助童鞋们回顾已经知道的那些知识. 1String对象不可改变的特性 下图显示了如下代码运行的过程: String s = "abcd"; s = s.c ...

  7. C语言指针的易错点

    1.内存泄漏:申请的堆内存没有释放. 2.内存污染:前面非法操作使用内存(没有报错),后面写着写着就出错.如下代码: 当结构体中只有划线部分代码时,在编译器中编写不会报错,但此时已经造成非法操作内存, ...

  8. 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容

    我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...

  9. HIVE的transform函数的使用

    Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况.例如,按日期统计每天出现的uid数,通常用如下的SQL SELECT date, ...

  10. UINavigationController 返回按钮去掉文字

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetric ...