ASP.NET Boilerplate插件模块或动态模块

时间:2018-04-04 09:20:51

标签: c# asp.net plugins module aspnetboilerplate

我是.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()方法中执行哪些操作,因为我必须返回AssembliesType?我已经提到了官方网站文档,如果他们提供了正确的示例,我无法找到它。提前谢谢。

1 个答案:

答案 0 :(得分:4)

您不应该实施IPlugInSource

该文档提供了一个明确的示例,说明如何启动类中添加插件源:

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.AddFolder(@"C:\MyPlugIns");
});

要清除您的疑问,请参阅FolderPlugInSource中的GetAssembliesGetModules方法:

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);
    }
}