Внедрение системы плагинов с использованием.Net Core Libraries с Autofac

Несколько месяцев назад я построил очень простую и эффективную систему плагинов с модулями автозапуска в ASP.Net Core 1.1, как это

В автозагрузке

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

Я должен был скопировать сборки в каталог bin работающего веб-приложения или работать со всеми сборками в основном веб-проекте. Все сборки были библиотеками классов.Net Framework. Через некоторое время я обновил все решение до Asp.Net Core 2.0, а модуль Autofac, содержащий сборки, изменился на.Net Core Class Libraries. Теперь модули autofac все еще найдены и зарегистрированы через RegisterAssemblyModules, но метод load больше не вызывается. Я понял, что если я создам еще один проект.Net Framework Library с модулем autofac и на него ссылаюсь, он все равно загружается, как и ожидалось, и вызывается метод load. Так что, мне кажется, эта проблема связана с.Net Core Libraries.

Кто-нибудь может объяснить мне это, знает какое-либо решение, обходной путь или может порекомендовать другую архитектуру для системы плагинов с autofac?

0 ответов

Другие вопросы по тегам