abp项目如何按业务功能模块横向分割?
1.为什么要做分层?
请先看项目分层的最后结构:
2.设计的初衷
项目较大,且主题鲜明,分为:BI模块、DM-用户洞察模块、Manage-应用管理模块、Report应用分析报表模块,大模块之间并无依赖关系。
部分功能模块因为代码存量很大,采用的是JQuery+Razor+MVC的技术栈,而现行的WebApi+Vue单页面应用与之技术栈不同,所以不放在同一个工程中并存使用,而是直接搬移旧代码,做CSS样式替换和权限控制。
为什么不通过SSO拆开独立子站点部署?体量不大,无需增大成本,以后如体量增大,大模块也可通过新增Web.Host工程单独部署。
3.稍微了解一下MVC的控制器寻找注册机制
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:
- 在分离的项目中引入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项目如何按业务功能模块横向分割?的更多相关文章
- Abp Zero——前端如何新增功能模块
为适应不同开发人员,abp rezo的UI实现了spa和mpa两套: spa--Single-page Application(单页面应用),默认"http://localhost/Acco ...
- springboot项目整合-注册功能模块开发
工程简介 准备工作:项目所用到的html界面以及sql文件链接如下:链接: https://pan.baidu.com/s/18loHJiKRC6FI6XkoANMSJg?pwd=nkz2 提取码: ...
- 文件一键上传、汉字转拼音、excel文件上传下载功能模块的实现
----------------------------------------------------------------------------------------------[版权申明: ...
- CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档……
功能模块.业务架构.需求分析.用户需求.系统分析.功能设计.详细设计.文档.业务.技术--很多被随口使用的名词,其实是含糊甚至错误的. 到底含糊在哪里,错误在哪里,不仅仅是新手软件开发人员糊涂,许多入 ...
- 关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法
关于金蝶k3 wise供应生门户登陆界面屏蔽业务账套多余功能模块设置方法 1. 找到以下路径 ...\Kingdee\K3ERP\KDHR\SITEFILE\WEBUI\ 找到“Login.aspx” ...
- OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能
OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...
- [Abp vNext 源码分析] - 2. 模块系统的变化
一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...
- ABP项目概述
在系统性介绍整个ABP框架之前,我们首先需要对ABP框架有一个大概的了解,ABP框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目)顾名思义就是能够通过 ...
- Castle Windsor常用介绍以及其在ABP项目的应用介绍
最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...
随机推荐
- MVC 之 架构的基本原理及Asp.Net实现MVC
一.引言 许多Web应用都是从数据存储中检索数据并将其显示给用户.在用户更改数据之后,系统再将更新内容存储到数据存储中.因为关键的信息流发生在数据存储和用户界面之间,所以很多应用将数据和用户界面这两部 ...
- php文件上传接口及文件上传错误服务器配置
一:上传表单 <form enctype="multipart/form-data" action="doFileUp.php" method=" ...
- 模块化开发RequireJS之shim配置
一.shim requirejs使用AMD规范开发,若开发过程中加载非AMD规范js,需要使用requirejs的shim进行配置. shim配置语法为: //配置文件 requirejs.confi ...
- 【BIEE】MDS-01377:无法从使用 JNDI 名称 “jdbc/mds/owsm” 配置的数据源获取数据库连接
这是一次意外关机情况,BIEE环境是window server2008,但是一次意外情况,BIEE自动关机了,造成开启成功新启动BIEE产生如下错误: 错误产生后,倒腾了半天,并没发现什么问题,只是通 ...
- Oracle 导入导出SQL 查看登录用户表个数
导出 : --注意结尾不能加分号; 导入 IMP HLMARKET/HLMARKET@192.168.1.22:1521/orcl file=e:/db/HLMARKET_20150729.dmp f ...
- 图解Java机制
一图胜过千万言!希望本文能帮助童鞋们回顾已经知道的那些知识. 1String对象不可改变的特性 下图显示了如下代码运行的过程: String s = "abcd"; s = s.c ...
- C语言指针的易错点
1.内存泄漏:申请的堆内存没有释放. 2.内存污染:前面非法操作使用内存(没有报错),后面写着写着就出错.如下代码: 当结构体中只有划线部分代码时,在编译器中编写不会报错,但此时已经造成非法操作内存, ...
- 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容
我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...
- HIVE的transform函数的使用
Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况.例如,按日期统计每天出现的uid数,通常用如下的SQL SELECT date, ...
- UINavigationController 返回按钮去掉文字
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetric ...