其他分享
首页 > 其他分享> > Natasha 4.0 探索之路系列(二) "域"与插件

Natasha 4.0 探索之路系列(二) "域"与插件

作者:互联网

域与ALC

在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题, 能不能兼容 AppDomain, 如何使用 AppDomain, 为什么 CoreAPI 阉割了 AppDomain 等一系列的问题.

今天答复一下:

Natasha 设计初衷是使用隔离性较强的字眼, 用域的概念来减少 .NETCore 带来的新的理解成本, 另外之前有打算兼容 AppDomain 的想法,

这个想法的优先级不高:

  1. 是.Net Core 是在 3.0 时出现比较明显的分水岭, 包括依赖解析,上下文域识别等重要特性的支持;
  2. 是 Roslyn 对 FW 的支持不能低于(4.6.1);
  3. 是 UT测试需要区分版本来做,很麻烦, 插件部分的测试不简单;
  4. 是 个人精力原因, 还要工作, 还要维护其他项目;

这里也希望公司们都能平稳度过升级期, 早点迎接更好更实用的"未来技术";

Natasha 域的使用

插件的开发技巧

这里不得不回顾一下插件开发的知识, 它可不是像培训机构讲的编译一个 DLL 然后 Assembly.LoadFrom 就可以的.
首先要了解加载插件的两个侧重点, 插件依赖打包和插件依赖管理.

<ItemGroup>
    <ProjectReference Include="..\IPlugin\IPlugin.csproj">
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
    </ProjectReference>
</ItemGroup>

以上是基本的插件开发知识,如果你还不了解, 可以读一读微软插件开发文档.

单独使用 NatashaDomain :

  1. 引入包 DotNetCore.Natasha.Domain 包.

  2. 加载插件

NatashaDomain domain = new NatashaDomain("NewPluginDomain");

//加载方法: 参数1: 插件位置; 参数2: 根据 AssemblyName 排除需要加载的插件名称.
//加载插件,如果主域存在相同名字的依赖,则使用版本较高的那版.  
domain.LoadPluginWithHighDependency("c:/xxx/pluginA.dll", excludeAssembliesFunc: asn => asn.Name.Contains("IPlugin"));

//加载插件,如果主域存在相同名字的依赖,则使用版本较低的那版.  
domain.LoadPluginWithLowDependency("c:/xxx/pluginA.dll", excludeAssembliesFunc: asn => asn.Name.Contains("IPlugin"));

//加载插件,如果主域存在相同名字的依赖,则使用主域中的那版.  
domain.LoadPluginUseDefaultDependency("c:/xxx/pluginA.dll");

//加载插件,不判重,全部加载.  
domain.LoadPluginWithAllDependency("c:/xxx/pluginA.dll", excludeAssembliesFunc: asn => asn.Name.Contains("IPlugin"));

//卸载域
domain.Dispose();

避坑指南

如果您使用以上 API 将插件加载到同一个域, 会出现很多问题:
问题案例

建议:

  1. 写插件时,本身解决好引用管理问题.
  2. 如果插件过于庞大,请将插件功能解耦,并加载到不同域中反射给主域执行.
  3. 主域要对依赖使用版本检查, 请在插件加载代码之前执行一些功能. 比如 _ = typeof(Dapper.CommandDefinition); 尽管这句没有用, 但它将迫使运行时将 dapper 的程序集加载到默认上下文的缓存中, 这样在你加载插件时, 如果遇到 dapper 依赖, 将触发版本检查详见代码.

结尾

您可以自行查看案例代码. NatashaDomain 是 Natasha 动态编译的父级, Natasha 动态编译中的 NatashaReferenceDomain 继承了此类, 因此如果您想使用 Natasha 进行动态构建请使用 NatashaReferenceDomain. 下一篇将讲解 Natasha 的基本编译知识.

标签:插件,4.0,IPlugin,主域,ALC,Natasha,加载
来源: https://www.cnblogs.com/NMSLanX/p/15799203.html