我是.NET开发人员,目前,我正在尝试学习ASP.NET Boilerplate。我遇到PlugIn Modules并且我认为它可以用于模块依赖,但是他们有这些我想要理解的行:
AbpBootstrapper 类定义 PlugInSources 属性,该属性可用于添加源以动态加载插件模块。插件源可以是实现 IPlugInSource 接口的任何类。 PlugInFolderSource 类实现它以从位于文件夹中的程序集中获取插件模块。
因此在尝试实现IPlugInSource
接口后:
using Abp.Modules;
using Abp.PlugIns;
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
public class EmpDetails : IPlugInSource
{
public string EmpName { get; set; }
public string Address { get; set; }
public string Email { get; set; }
public List<Assembly> GetAssemblies()
{
throw new NotImplementedException();
}
public List<Type> GetModules()
{
throw new NotImplementedException();
}
}
我的疑问是:我必须在GetAssemblies()
和GetModules()
方法中执行哪些操作,因为我必须返回Assemblies
和Type
?我已经提到了官方网站文档,如果他们提供了正确的示例,我无法找到它。提前谢谢。
答案 0 :(得分:4)
您不应该实施IPlugInSource
。
该文档提供了一个明确的示例,说明如何在启动类中添加插件源:
services.AddAbp<MyStartupModule>(options =>
{
options.PlugInSources.AddFolder(@"C:\MyPlugIns");
});
要清除您的疑问,请参阅FolderPlugInSource
中的GetAssemblies
和GetModules
方法:
public class FolderPlugInSource : IPlugInSource
{
public string Folder { get; }
public SearchOption SearchOption { get; set; }
private readonly Lazy<List<Assembly>> _assemblies;
public FolderPlugInSource(string folder, SearchOption searchOption = SearchOption.TopDirectoryOnly)
{
Folder = folder;
SearchOption = searchOption;
_assemblies = new Lazy<List<Assembly>>(LoadAssemblies, true);
}
public List<Assembly> GetAssemblies()
{
return _assemblies.Value;
}
public List<Type> GetModules()
{
var modules = new List<Type>();
foreach (var assembly in GetAssemblies())
{
try
{
foreach (var type in assembly.GetTypes())
{
if (AbpModule.IsAbpModule(type))
{
modules.AddIfNotContains(type);
}
}
}
catch (Exception ex)
{
throw new AbpInitializationException("Could not get module types from assembly: " + assembly.FullName, ex);
}
}
return modules;
}
private List<Assembly> LoadAssemblies()
{
return AssemblyHelper.GetAllAssembliesInFolder(Folder, SearchOption);
}
}