c# - ASP.Net Core 3.1 的 Autofac 配置不起作用
问题描述
我正在尝试将 Autofac 与 ASP.Net Core 3.1 一起使用,但我遇到了一个没有意义的异常。
我收到以下异常:
Autofac.Core.Activators.Reflection.NoConstructorsFoundException:'没有为类型'Microsoft.AspNetCore.Mvc.ModelBinding.CompositeBindingSource'找到可访问的构造函数。'
我认为问题可能是因为注册服务的顺序,但我不知道我做错了什么。我的配置如下:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Startup.cs 类
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public ILifetimeScope AutofacContainer { get; private set; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<EShopDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DBConnection")));
services.AddSwaggerGen();
services.AddOptions();
}
public void ConfigureContainer(ContainerBuilder containerBuilder)
{
containerBuilder.RegisterModule(new AutofacModule());
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "eShop");
c.RoutePrefix = string.Empty;
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
AutofacModule.cs 类
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// scan all assemblies in current application domain and resolve them on convention
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.AsImplementedInterfaces();
}
}
我错过了什么?
解决方案
我能够在示例代码的帮助下找到问题...
对我来说,问题出在AutofacModule.cs类中。我错误地扫描了组件。这是工作代码。
public class AutofacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// scan all assemblies in current application domain and resolve them on convention
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.AsImplementedInterfaces();
}
}
Autofac 在 Github 中有项目示例,我发现他们的文档与示例代码不同。这是 ASP.Net Core 3.1 示例的链接。对于任何想要查看配置的人。
推荐阅读
- python - 如何解决 keras 拟合函数错误“所有输入数组 (x) 应具有相同数量的样本”?
- atom-editor - 你如何 console.log 登录 Atom?
- python - 如何使用 python 在 Tor 浏览器中启动链接?
- java - 打开 Api $ref 使用 url
- c# - 如何让 API 调用等到之前的调用完成
- javascript - vue 显示 js 的错误 :TypeError: "this is undefined"
- android - 重用横向和纵向的布局
- ios - 在 IOS 中按下电源按钮或自动关闭屏幕时请求失败(仅在真实设备上发生)
- c++ - 用于 win32、linux、mac 的 POSIX C 包装器
- ios - 在 Swift 中使文本斜体没有“-Italic”字体文件