0

几个月前,我在 ASP.Net Core 1.1 中使用 autofac 模块构建了一个非常简单但仍然有效的插件系统,就像这样

在启动.cs

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  var builder = new ContainerBuilder();
  builder.RegisterModule<AutofacModule>();
  builder.Populate(services);
  var ApplicationContainer = builder.Build();
  return new AutofacServiceProvider(ApplicationContainer);
}

然后在 AutofacModule.cs

protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);
        builder.RegisterType<AuthMessageSender>().As<IEmailSender>();
        builder.RegisterType<AuthMessageSender>().As<ISmsSender>();
        builder.RegisterType<HttpClient>().As<HttpClient>();
        foreach (var assembly in LoadAllAssemblies())
        {
            builder.RegisterAssemblyModules(assembly);
        }
    }

    private IEnumerable<Assembly> LoadAllAssemblies()
    {
        string assemblyPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "");
        var allAssemblies = new List<Assembly>();
        foreach (string dll in Directory.GetFiles(assemblyPath, "*.dll"))
        {
            try
            {
                var assembly = Assembly.LoadFile(dll);
                if (!assembly.GetTypes().Any(type => type.IsSubclassOf(typeof(Autofac.Module))))
                {
                    continue;
                }
                allAssemblies.Add(assembly);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                continue;
            }
        }
        return allAssemblies;
    }

然后我可以从这样的程序集中加载模块:

    public class AutofacModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        base.Load(builder);
        builder.RegisterType<UserService>().As<IUserService>();
        builder.RegisterType<DashboardService>().As<IDashboardService>();
        builder.RegisterType<DetailPageService>().As<IDetailPanelService>();
        builder.RegisterType<PlanningService>().As<IPlanningService>();
        builder.RegisterType<PlanningRepository>().As<IPlanningRepository>();     
    }
}

我必须将程序集复制到正在运行的 Web 应用程序 bin 目录才能工作,或者引用主 Web 项目中的所有程序集。所有程序集都是 .Net Framework 类库。过了一会儿,我将整个解决方案更新为 Asp.Net Core 2.0,并且包含程序集的 Autofac 模块更改为 .Net Core 类库。现在,仍然可以找到 autofac 模块,并通过 RegisterAssemblyModules 进行注册,但不再调用 load 方法。我意识到,如果我使用 autofac 模块创建另一个 .Net Framework Library 项目并引用它,它仍然会按预期加载,并调用加载方法。所以在我看来,这个问题与.Net Core Libraries 有关。

任何人都可以向我解释这一点,知道任何解决方案,解决方法,还是可以推荐另一种带有 autofac 的插件系统架构?

4

0 回答 0