在Asp.NET Core 3.1上注入依赖项时出现Autofac.Core.Activators.Reflection



我想使用autofac注入依赖项,如下所示:

启动.cs

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthorization(options => { options.AddPolicy("Enabled", policy => policy.Requirements.Add(new UserEnableRequirement())); });
services.AddSingleton<IAuthorizationHandler, UserEnableHandler>();
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule<DependencyInjectionModule>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment() || env.IsEnvironment("Local"))
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}

app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseFileServer();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}

程序.cs

Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

DependencyInjectionModule.cs

public class DependencyInjectionModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterModule<DAL.DependencyInjectionModule>();
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()).AsImplementedInterfaces().InstancePerLifetimeScope();
}
}

DAL.DependencyInjectionModule.cs

public class DependencyInjectionModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(ThisAssembly).Where(t => t.Namespace == "DAL.Repositories").AsImplementedInterfaces().InstancePerLifetimeScope();
}
}

但当我启动它时,返回一个奇怪的错误:

Autofac.Core.Activators.Reflection.NoConstructorsFoundException:"找不到类型为"Microsoft.Extensions.Cacheching.Memory.CacheEntry"的可访问构造函数。">

如果我添加此命令:

services.AddSingleton<IMemoryCache, MemoryCache>();

它返回相同的错误,但指向另一个本机类型的

Autofac.Core.Activators.Reflection.NoConstructorsFoundException:"找不到类型"Microsoft.AspNetCore.DataProtection.Cng.BCryptGenRandomImpl"的可访问构造函数。">

我不知道我错过了什么。由于这个错误与我的程序包无关,我如何绕过它,而不编写如上所述的无用指令?

JohanP 更新

public class UserEnableRequirement : IAuthorizationRequirement
{
....
}
public class UserEnableHandler : AuthorizationHandler<UserEnableRequirement>{...

您的问题在这里:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()).AsImplementedInterfaces().InstancePerLifetimeScope();

您正试图用Autofac注册整个系统中的所有类型。这包括所有ASP.NET核心程序集和所有内容。这包括来自您不拥有的程序集的Microsoft.AspNetCore.DataProtection.Cng.BCryptGenRandomImpl类型。

基本上,不要那样做

对你注册的内容要有选择性。组装扫描是针对诸如";我的程序集中有一堆处理程序,或者我控制的一组程序集中有。我想将它们全部注册"这不是为";在系统中注册所有内容">

  • 对程序集要挑剔
  • 筛选到您实际想要解析的类型
// Maybe only use the application assembly?
var assembly = typeof(Startup).Assembly;
// Only register stuff you need to, maybe some handlers
// or something. Note ASP.NET Core already handles
// registering controllers when you do
// services.AddControllersWithViews() so there's
// no value in registering those again.
builder.RegisterAssemblyTypes(assembly)
.Where(t => t.Name.Contains("Handler"))
.AsImplementedInterfaces();
// You can do this multiple times, you don't have to
// filter everything and register all in one go.
builder.RegisterAssemblyTypes(assembly)
.Where(t => t.Name.Contains("Repository"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();

相关内容

最新更新