模块化插件
扩展方法可以获取配置插件源的选项.
示例: 从文件夹加载插件
- 这是典型的ASP.NET Core应用程序的
Startup
类. PlugInSources.AddFolder
从指定的目录中加载程序集(通常为dll).
就这样.ABP将在这个目录中发现这些模块,像其它常规一样配置和初始化它们.
options.PlugInSources
类实际上是IPlugInSource
接口的一系列实现并且 AddFolder
方法仅仅是以下表达式的便捷方法:
options.PlugInSources.Add(new FolderPlugInSource(@"D:\Temp\MyPlugIns"));
这里有两个内置插件源的示例:
PlugInSources.AddFiles()
方法获取程序集(通常是dll)文件列表.这是使用FilePlugInSource
类的快捷方式.PlugInSources.AddTypes()
方法获取模块类类型的列表.如果实用化此方法,则需要自己加载模块的程序集,但是在需要时它提供了灵活性.这是使用TypePlugInSource
类的快捷方式.
如果需要,你可以创建自己的IPlugInSource
的接口实现,并像其它方法一样添加到options.PlugInSources
中.
在一个解决方案中创建一个简单的类库项目
你可以在模块中添加需要使用的ABP框架包.至少,你应该为这个项目添加包Volo.Abp.Core
:
每个必须声明为一个继承自AbpModule
的类.这里是一个简单的模块类,用于解析一个服务并在应用启动时对其初始化:
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
using Volo.Abp.Modularity;
namespace MyPlugIn
{
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var myService = context.ServiceProvider
.GetRequiredService<MyService>();
myService.Initialize();
}
}
}
编译这个项目,打开build目录,找到MyPlugIn.dll
:
将MyPlugIn.dll
复制到到插件目录中(此实例为D:\Temp\MyPlugIns
).
如果你已经按照上述方式配置了主应用程序(参见“基础用法”部分),那么在应用程序启动时,你可以看到“MyService has been initialized(MyService已经初始化)的日志.
创建内部带视图的插件需要更多的注意.
在解决方案中创建一个新的类库项目:
编辑这个.csproj
文件内容:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<OutputType>Library</OutputType>
<IsPackable>true</IsPackable>
<ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared" Version="4.0.1" />
</ItemGroup>
</Project>
- 将
Sdk
修改为Microsoft.NET.Sdk.Web
. - 添加了
OutputType
和IsPackable
属性. - 添加了
Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared
NuGet包.
接下来在插件中创建模块类:
- 由于我们添加了相关的NuGet包,因此取决于
AbpAspNetCoreMvcUiThemeSharedModule
. - 添加插件程序集到ASP.NET Core MVC的
PartManager
中.这是ASP.NET Core所必需的.否则,你插件中的控制器将无法正常工作. - 添加插件的视图程序集到ASP.NET Core MVC的
PartManager
中.这是ASP.NET Core所必需的.否则,你在插件中的视图将不起作用.
@page
@model MyMvcUIPlugIn.Pages.MyPlugInPage
<h1>Welcome to my plug-in page</h1>
<p>This page is located inside a plug-in module! :)</p>
现在,你可以构建插件项目.它将产生以下输出:
将MyMvcUIPlugIn.dll
和MyMvcUIPlugIn.Views.dll
复制到到插件目录下(此示例中为D:\Temp\MyPlugIns
).
如果你已经按照上述方式配置了主应用程序(参见“基础用法”部分),那么在应用程序启动的时候,你应该能够访问URL:
在现实世界中,你的插件可能具有一些外部依赖性.另外,你的应用程序可能被设计为支持插件.所有这些都是你自己的系统要求.ABP做的仅仅是在应用程序启动时加载模块.你在这些模块中执行什么操作由你决定.
但是,我们可以为一些常见情况提供一些建议.
对于包/dll依赖,你可以将相关的dll复制到插件目录下.ABP会自动将所有程序集加载到该目录下,并且你的插件将按预期工作.
如果你的模块使用关系型数据库和Entity Framework Core, 那么它需要在数据库中提供表.有多种不同的方法可确保在应用程序使用插件时创建表.一些例子;
- 插件可以检查数据库表是否存在,并在应用程序启动时创建表,或者如果插件已更新且需要进行某些架构更改时,则会迁移它们.你可以使用EF Core的迁移API来做到这一点.
可能还有其它解决方案.例如,如果你的数据库管理员不允许你在应用程序代码中更改数据库模式,则可能需要手动将SQL文件发送给数据库管理员,以将其应用于数据库.