ASP.NET 样板插件模块或动态模块

ASP.NET Boilerplate Plugin Module or Dynamic Module

我是一名 .NET 开发人员,目前,我正在努力学习 ASP.NET 样板。我遇到了 PlugIn Modules 并且我知道它可以用于模块依赖性,但是我试图理解它们有这些行:

The AbpBootstrapper class defines the PlugInSources property which can be used to add sources to dynamically load plugin modules. A plugin source can be any class implementing the IPlugInSource interface. The PlugInFolderSource class implements it to get the plugin modules from assemblies located in a folder.

所以在尝试实现 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 中我必须 return?我已经参考了官方网站文档,但我找不到他们是否正确提供了示例。提前致谢。

您不应该实施 IPlugInSource

该文档提供了一个清晰的示例,说明如何在 Startup class:

添加插件源]
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);
    }
}