OrchardCore的模块加载机制
时间: 2019-05-05来源:博客园
前景提要
OrchardCore的模块加载机制
0 悬赏园豆: 10 [待解决问题] 这两天研究了下OrchardCMS系统,没搞明白如何加载模块的。
分析代码如下: public class AssemblyAttributeModuleNamesProvider : IModuleNamesProvider { private readonly List< string > _moduleNames; public AssemblyAttributeModuleNamesProvider(IHostingEnvironment hostingEnvironment) { var assembly = Assembly.Load( new AssemblyName(hostingEnvironment.ApplicationName)); _moduleNames = assembly.GetCustomAttributes<ModuleNameAttribute>().Select(m => m.Name).ToList(); } public IEnumerable< string > GetModuleNames() { return _moduleNames; } }
这里, assembly.GetCustomAttributes<ModuleNameAttribute>()
怎么就把多达69个模块加载了呢? Orchard dotnet triout | 初学一级 | 园豆: 13
提问于:2019-05-05 21:52 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(2) 0 OrchardCore 中,如果某项目A依赖了某个模块B,会在A程序集中自动添加一个 ModuleNameAttribute,通常存在多个。
你用 .Net Reflector 查看 Web 项目,就会看到类似于下面的内容:
// Assembly XXX.Web, Version 1.0.0.0
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows=true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue |
......
[assembly: ModuleName("Tubumu.Modules.Admin")]
[assembly: ModuleName("Tubumu.Modules.Framework")]
[assembly: ModuleName("XXX.Modules.Core")]
......
而 assembly.GetCustomAttributes<ModuleNameAttribute>() 只是收集到这些 Attribute 而已。至于如何加载,可以参考下: https://blog.tubumu.com/2018/11/26/orchardcore-modular-and-multi-tenancy/ alby | 园豆:323 (菜鸟二级) | 2019-05-24 17:06 OrchardCore 中,如果某项目A依赖了某个模块B,会在A程序集中自动添加一个 ModuleNameAttribute,通常存在多个。
这个自定添加ModuleNameAttribute 是怎么做到的呢?一般我们编程都是自己手写上的. 支持( 0 ) 反对( 0 ) 人死一寸灰 | 园豆:174 (初学一级) | 2019-06-14 11:17 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 模块之间的依赖关系是通过Nuget 包工具自动注入Assembly 属性来完成。在 OrchardCore.Cms.Web.csproj文件中引用了
<Import Project="..\OrchardCore\OrchardCore.Application.Targets\OrchardCore.Application.Targets.targets" />
在这个文件中,就定义了自动生成Assembly:ModuleNameAttribute 属性了。
<ItemGroup>
<AssemblyAttribute Include="OrchardCore.Modules.Manifest.ModuleNameAttribute" Condition="'@(ModuleNames)' != ''">
<_Parameter1>%(ModuleNames.Identity)</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
</Target>
OrchardCore 项目采用了Nuget工具包的方式,来实现自动注入的。要想了解Nuget工具包具体怎么操作,那就得去查Microsoft 官方文档了。也可以参考吕毅老师的文章:https://blog.walterlv.com/post/build-source-code-package-for-wpf-projects.html 顶新 | 园豆:209 (菜鸟二级) | 2019-07-25 20:38 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行