zoukankan      html  css  js  c++  java
  • 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="AreasReportViews***.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,完成项目剥离。
  • 相关阅读:
    (转载)MP3 编码解码 附完整c代码
    (转载) 一个大概的框架
    (转载)音视频相关的书籍,多媒体技术
    js原生选项卡切换
    点击div删除div本身
    鼠标移入旋转动画
    鼠标移入,改变border颜色
    小白初建博客!
    java设计模式--六大原则
    java设计模式--策略模式
  • 原文地址:https://www.cnblogs.com/Imaigne/p/10565776.html
Copyright © 2011-2022 走看看