Внедрение системы плагинов с использованием.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?