abp项目如何按业务功能模块横向分割?

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,完成项目剥离。
posted @ 2019-03-20 16:28  孤城唯一客  阅读(873)  评论(0编辑  收藏  举报