Как загрузить контроллер ASP.NET Core из сборки подключаемого модуля с использованием конфигурации Autofac? - PullRequest
0 голосов
/ 06 октября 2018

Я новичок в .NET Core, но я использую Autofac в ASP.NET, и я пытаюсь зарегистрировать контроллер, используя конфигурацию Autofac , как я это делал в ASP.NET .Я прочитал кучу примеров кода, но похоже, что руководство Autofac для .NET Core не работает с .NET Core 2.1.

Моя цель - загрузить контроллеры из другого проекта с использованием конфигурации Autofac.Есть ли какой-нибудь рабочий пример?

Я использую Autofac.Configuration в .NET 4.7 для внедрения контроллеров в качестве плагинов, но мне не удается включить Autofac.Configuration в .NET Core 2.1 Я создал небольшой ASP.NET Coreпроект и несколько контроллеров в другом проекте.Идея состоит в том, чтобы включить эти контроллеры в проект ASP.NET Core от Autofac.Configuration.

Вот мой конфигурационный файл autofac.json

{
  "components": [{
    "type": "Controllers.UserController, Controllers",
    "services": [{"type": "Common.IController, Common"}]
  }]
}

Вот код из Startup.cs

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  services.AddMvc().AddControllersAsServices();
  var builder = new ContainerBuilder();
  var mseConfig = new ConfigurationBuilder(); 
  mseConfig.AddJsonFile("autofac.json");
  var module = new ConfigurationModule(mseConfig.Build()); 
  builder.RegisterModule(module);
  builder.Populate(services);
  var container = builder.Build();
  return new AutofacServiceProvider(container);
}

Я получаю сообщение об ошибке: «System.InvalidOperationException:« Тип 'Controllers.UserController, Controllers' не найден. Для этого может потребоваться квалификация сборки, например, "MyType, MyAssembly". ""

Controllers.dll файл присутствует в папке bin проекта ASP.NET Core.

1 Ответ

0 голосов
/ 10 октября 2018

Я создал рабочий пример в репозитории Autofac examples. .

Проблема заключается в том, что загрузчик сборок .NET Core НЕ просто предполагает наличие вещей в папке binявляются загружаемыми. Вам абсолютно необходимо указать загрузчику сборок .NET Core, где можно получить сборки, на которые нет прямой ссылки.Это не конфигурация Autofac, это .NET Core, и это довольно запутанная новая система загрузчика.

Когда Autofac.Configuration пытается загрузить настроенный тип из сборки, на которую нет ссылок, загрузчик .NET Core нене распознает сборку и вызывает событие, которое нужно обработать, чтобы оно могло работать.Простое решение, как показано в примере:

AssemblyLoadContext.Default.Resolving += (AssemblyLoadContext context, AssemblyName assembly) =>
{
  // DISCLAIMER: NO PROMISES THIS IS SECURE. You may or may not want this strategy. It's up to
  // you to determine if allowing any assembly in the directory to be loaded is acceptable. This
  // is for demo purposes only.
  return context.LoadFromAssemblyPath(Path.Combine(Directory.GetCurrentDirectory(), $"{assembly.Name}.dll"));
};

Самый простой тест, который вы можете сделать из своего кода: если вы выполните Type.GetType("MyNamespace.MyType, MyAssembly") и получите null, .NET Core не найдет вашвведите, и вам нужно обработать загрузку сборки.

Для получения дополнительной информации вы должны искать вопросы / ответы о том, как работает загрузка сборки .NET Core.

...