如何使用Autofac配置从插件程序集中加载ASP.NET Core控制器?

时间:2018-10-06 20:03:48

标签: .net asp.net-core .net-core autofac asp.net-core-2.1

我是.NET Core的新手,但是我一直在ASP.NET中使用Autofac,并且我正在尝试使用Autofac配置as I did in ASP.NET注册一个控制器。我读了很多代码示例,但是.NET Core的Autofac手册似乎无法与.NET Core 2.1一起使用。

我的目标是使用Autofac配置从另一个项目中加载控制器。有没有可行的例子?

我正在使用.NET 4.7中的Autofac.Configuration来将控制器作为插件注入,但是无法在.NET Core 2.1中包含Autofac.Configuration。 我创建了一个小型ASP.NET Core项目,并在其他项目中创建了几个控制器。这个想法是通过Autofac.Configuration将那些Controllers包含在ASP.NET Core项目中。

这是我的autofac.json配置文件

['a', 3, 'b', 1, 'c', 1, 'd', 1, 'e', 0, 'f', 2]

这是Startup.cs中的代码

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

我收到的错误是“ System.InvalidOperationException:'类型'Controllers.UserController,Controllers'找不到。它可能需要程序集限定,例如“ MyType,MyAssembly”。'

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); } 文件位于ASP.NET Core项目的bin文件夹中。

1 个答案:

答案 0 :(得分:0)

我已经创建了a working example in the Autofac Examples repo

问题在于.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程序集加载方式的问题/答案。