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。


public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(typeof(DMWebHostModule).GetAssembly());
var partManager = IocManager.Resolve<ApplicationPartManager>();
//分离类库里的任意类。
var type = typeof(BIApiController);
var assembly = type.Assembly;
//判断是否存在
if (!partManager.ApplicationParts.Any(o => o.Name == type.Namespace))
{
//添加分离类库的程序集
partManager.ApplicationParts.Add(new AssemblyPart(assembly));
}
}
}
解决方案2:
  1. 在分离的项目中引入ABP,新建ReportWebCoreMudule.cs
 [DependsOn(
typeof(ReportApplicationModule),
typeof(AbpAspNetCoreModule)
)]
public class ReportWebCoreMudule : AbpModule
{
private readonly IHostingEnvironment _env;
private readonly IConfigurationRoot _appConfiguration; public ReportWebCoreMudule(IHostingEnvironment env)
{
_env = env;
_appConfiguration = AppConfigurations.Get(env.ContentRootPath, env.EnvironmentName, env.IsDevelopment()); }
public override void PostInitialize()
{ }
public override void PreInitialize()
{
//把工程根目录Razor文件夹添加到嵌入资源
Configuration.EmbeddedResources.Sources.Add(
new EmbeddedResourceSet(
"/Views/",
typeof(ReportWebCoreMudule).GetAssembly(),
//这里需要注意:为项目的默认命名空间+文件夹路径,这个SD_Game.Report.Web.Core项目的默认命名空间为:SD_Game.Report,并非SD_Game.Report.Web.Core,因为我修改了。
"SD_Game.Report.Views"
)
);
//把工程Area目录下的文件夹添加到嵌入资源
Configuration.EmbeddedResources.Sources.Add(
new EmbeddedResourceSet(
"/Areas/Report/Views/",
typeof(ReportWebCoreMudule).GetAssembly(),
"SD_Game.Report.Areas.Report.Views"
)
); //动态路由的注入,即IApplicationServices的实现类注入。
Configuration.Modules.AbpAspNetCore()
.CreateControllersForAppServices(
typeof(ReportApplicationModule).GetAssembly(), "report"
); } public override void Initialize()
{
var assembly = typeof(ReportWebCoreMudule).GetAssembly();
IocManager.RegisterAssemblyByConvention(assembly);
var partManager = IocManager.Resolve<ApplicationPartManager>();
if (!partManager.ApplicationParts.Any(o => o.Name == assembly.FullName))
{
partManager.ApplicationParts.Add(new AssemblyPart(assembly));
}
}
}

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

[DependsOn(
typeof(ManageWebCoreMudule),
//依赖创建的模块,其他都不用修改
typeof(ReportWebCoreMudule),
typeof(BIWebCoreMudule),
typeof(DMWebCoreModule)
)]
public class DMWebHostModule : AbpModule
{
...
}

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

解决方案:

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

 <ItemGroup>
<EmbeddedResource Include="Views\**\*.cshtml" />
<EmbeddedResource Include="Areas\Report\Views\**\*.cshtml" />
</ItemGroup>

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

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

修改: SD_Game.Web.Host.csproj

新增:
<CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>

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

<RazorCompileOnPublish>true</RazorCompileOnPublish>
<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. 记一次MySQL找回用户数据

    事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出 ...

  2. WebBrowser.ExecWB

      CreateTime--2017年9月22日16:30:10 Author:Marydon js操作浏览器的ExecWB命令 一.准备工作: 以ie浏览器为例,需要更改IE安全级别为:" ...

  3. ajax 异步 通信 小例子 servlet与 jsp异步 get

    get  请求参数通过 url那里写进去,然后send(null) html文件和 servlet进行通信 通过ajax 进行通信 <!DOCTYPE html PUBLIC "-// ...

  4. HTML5学习笔记3 内联SVG

    HTML5支持内联SVG 下面来介绍一下什么是SVG SVG可缩放矢量图形 可缩放矢量是基于可扩展标记语言(标准通用语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准 ...

  5. XP win2003系统 微软雅黑字体的使用方法

    微软雅黑是微软公司为其新一代操作系统Vista开发的中文字体,据说它将是迄今为止个人电脑上可以显示的最清晰的中文字体.       微软公司表示,在新一代操作系统中为了能够更加清晰的显示文字,目前正在 ...

  6. Windows下Python添加MySQLdb扩展模块

    [更新 2012-09-16] 这里可以下载已经打包好的EXE文件,http://sourceforge.net/projects/mysql-python/(国内需穿越才可访问) DBank备份下载 ...

  7. Xml+Xslt测试工具

    下载地址:http://download.csdn.net/detail/a497785609/5791359 说明:下载后,修改下Xslt部分的头部:<xsl:stylesheet versi ...

  8. Event-Souring模式

    Event-Sourcing模式使用仅附加存储来记录或描写叙述域中数据所採取的动作,从而记录完整的一系列系列事件,而不是仅存储实体的当前状态.由于存储包括全部的事件,能够用来具体化域对象. Event ...

  9. Android 中查看内存的使用情况集经常使用adb命令

    1. 在IDE中查看Log信息 当程序执行垃圾回收的时候,会打印一条Log信息.其格式例如以下: D/dalvikvm: <GC_Reason> <Amount_freed>, ...

  10. Vivado Logic Analyzer的使用

    chipscope中,通常有两种方法设置需要捕获的信号.1.添加cdc文件,然后在网表中寻找并添加信号2.添加ICON.ILA和VIO的IP Core 第一种方法,代码的修改量小,适当的保留设计的层级 ...