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. Android Exception 12(has leaked ServiceConnection)

    09-09 15:12:31.154: E/ActivityThread(18855): Activity com..xxx.xx.act.LoadingAct has leaked ServiceC ...

  2. monogdb windows环境下 安装及使用简单示例

    1,下载地址:http://www.mongodb.org/downloads,选择windows平台,当前最新的版本是:2.6.4,本机是64位win7系统,我选择的是windows 64位msi, ...

  3. js jquery 结束循环

    js 中跳出循环用break,结束本次循环用continue,jqeruy 中循环分别对应 return false 和return true. jquery 中each循环 跳出用return tr ...

  4. php中数据类型自动转换

    1.1 转为布尔型(即返回值为0) 空字符串''或"" 数字0或0.0 字符'0'或"0" 空值NULL 没有成员的数组    其余都转换成布尔型true,包含 ...

  5. EMQ学习笔记---Clean Session和Retained Message

    MQTT会话(Clean Session)MQTT客户端向服务器发起CONNECT请求时,可以通过’Clean Session’标志设置会话.‘Clean Session’设置为0,表示创建一个持久会 ...

  6. Mongodb的CRUD

    1.查询 使用db.collection.find()方法进行查询.db.collection.findOne()返回单个文档.mongodb的所有查询操作都是针对单个collection > ...

  7. 堆越界--coredump 在malloc函数里

    一,可执行程序分析: objdump -h xxx,可以看到程序内部各个段的内存分布,结果如下(部分):  26 .data         0000016c  0000000000879d20  0 ...

  8. LAMP架构二

    安装PHP7 1.查看php配置文件信息(phpinfo),php有两个配置文件开发环境和生产环境 [root@localhost php-5.6.30]# /usr/local/php/bin/ph ...

  9. Lintcode---验证二叉查找树

    给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 一个节点的 ...

  10. atitit.系统架构图 的设计 与工具 attilax总结

    atitit.系统架构图 的设计 与工具 attilax总结 1. 架构图的4个版式(标准,(左右)悬挂1 2. 架构图的层次结构(下属,同事,助手)1 3. wps ppt1 4. 使用EDraw画 ...