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. U3D实现与iOS交互

    原地址:http://502317120.blog.51cto.com/4062300/1077733 在开发中有很多情况下会用到U3D调用iOS中的函数. 例如在U3D中,我们需要调用到一个iOS ...

  2. cordova百度地图定位Android版插件

    本插件利用百度地图提供的定位功能进行Android版手机定位. 为什么没有iOS版? 因为iOS版有官方的定位插件cordova-plugin-geolocation可以使用. 请参照:cordova ...

  3. [Swift A] - HTTP请求

    iOS开发中大部分App的网络数据交换是基于HTTP协议的.本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法. 注意:网络请求完成后会获得一个NSData类型的返回数据,如果数据格式为J ...

  4. javascript对于0的解读

      CreateTime--2017年6月29日10:36:01Author:Marydon javascript对于0的解读 1.0与“0” 1.1 判断0与"0"是否相等 测试 ...

  5. lucene示例

    搭建环境 搭建Lucene的开发环境只需要加入Lucene的Jar包,要加入的jar包至少要有: lucene-core-3.0.1.jar(核心包) contrib\analyzers\common ...

  6. spring中的AOP 以及各种通知 配置

    理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...

  7. GridView中实现全选与取消全选,以便同时删除多条数据

    我们项目后台操作中不可避免的会有同时删除多项的操作,本文实现的就是当点击全选时,选定当前页中所有项,当取消了某一项的选定,则“全选”CheckBox的checked也为false:然后在后台中取到所选 ...

  8. Firefly 3288又一次制作android和lubuntu双系统固件

    又一次制作android和lubuntu双系统固件 因为本人改动了lubuntu的驱动和设备树信息,为了方便烧写系统,所以又一次制作了双系统的固件. Firefly wiki教程里有android固件 ...

  9. Ant—使用Ant构建简单Java项目(三)

    博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...

  10. POJ 1258:Agri-Net(最小生成树&amp;&amp;prim)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38918   Accepted: 15751 Descri ...