我是.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文件夹中。
答案 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程序集加载方式的问题/答案。