c# - Autofac 程序集扫描 - .NET Core
问题描述
我一直在尝试让程序集扫描在我的 .NET core 2.0 项目中工作。
我得到的例外
Autofac.Core.Registration.ComponentNotRegisteredException
HResult=0x80131500
Message=The requested service 'Microsoft.AspNetCore.Hosting.Internal.WebHostOptions' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.
Source=Autofac
StackTrace:
at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.AspNetCore.Hosting.WebHostExtensions.<RunAsync>d__4.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
at Track4Corp.VehicleDatabase.Server.Program.Main(String[] args) in C:\Users\Admin\source\repos\VehicleDatabase-server\src\Track4Corp.VehicleDatabase.Server\Program.cs:line 10
程序.cs
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace Track4Corp.VehicleDatabase.Server
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
创业班
public class Startup
{
public Autofac.IContainer ApplicationContainer { get; private set; }
public IConfigurationRoot Configuration { get; private set; }
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//TODO: Move out of code before release
services.AddDbContext<UserDBContext>(options => options.UseSqlServer("Server=DESKTOP-9L9IGFE;Database=DB;Trusted_Connection=True;"));
//Autofac Assembly Registration
ApplicationContainer = AutoFacAssemblyRegistration.RegisterAllAssemblies();
return new AutofacServiceProvider(ApplicationContainer);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
所以我的实际构建器我转移到另一个项目,我现在在我知道所有 dll 文件所在的硬编码路径上扫描。我在调试模式下运行它,看到它们都在那里。
public class AutoFacAssemblyRegistration
{
public static IContainer RegisterAllAssemblies()
{
var builder = new ContainerBuilder();
string executingDirectory = Directory.GetCurrentDirectory();
// string[] files = Directory.GetFiles(executingDirectory, "*.dll");
string[] files = Directory.GetFiles(@"PATH_HERE", "*.dll");
var listOfAssemblies = new List<Assembly>();
foreach (string item in files)
{
listOfAssemblies.Add(item: Assembly.LoadFile(item));
}
builder.RegisterAssemblyTypes(listOfAssemblies.ToArray()).AsImplementedInterfaces().InstancePerLifetimeScope();
//builder.RegisterAssemblyModules(listOfAssemblies.ToArray());
return builder.Build();
}
}
我还尝试了不同类型的解决方案来注册程序集,例如
foreach (Assembly item in listOfAssemblies)
{
System.Type[] assemblyType = item.GetTypes();
foreach (System.Type typeItem in assemblyType)
{
if (typeItem.IsInterface)
{
Autofac.Builder.IRegistrationBuilder<object, Autofac.Builder.ConcreteReflectionActivatorData,
Autofac.Builder.SingleRegistrationStyle> registration =
builder.RegisterType(typeItem).AsImplementedInterfaces();
if (typeItem.GetInterfaces().Any(i => i.IsAssignableFrom(typeof(ISingletonDependency))))
{
registration.SingleInstance();
}
else
{
registration.InstancePerRequest();
}
}
}
}
我想知道我是否做错了什么,或者这在 .NET core 2.1 项目中是不可能的?
如果有人能提示我正确的方向,如何解决我的问题,那就太好了。
解决方案
有一个类似的问题,并通过containerBuilder.Populate(serviceCollection)
在做之前添加来解决它containerBuilder.Build()
。
按照您在问题中提供的示例,它看起来像这样 -
public class AutoFacAssemblyRegistration
{
public static IContainer RegisterAllAssemblies(IServiceCollection services)
{
var builder = new ContainerBuilder();
builder.Populate(services);
string executingDirectory = Directory.GetCurrentDirectory();
// string[] files = Directory.GetFiles(executingDirectory, "*.dll");
string[] files = Directory.GetFiles(@"PATH_HERE", "*.dll");
var listOfAssemblies = new List<Assembly>();
foreach (string item in files)
{
listOfAssemblies.Add(item: Assembly.LoadFile(item));
}
builder.RegisterAssemblyTypes(listOfAssemblies.ToArray()).AsImplementedInterfaces().InstancePerLifetimeScope();
//builder.RegisterAssemblyModules(listOfAssemblies.ToArray());
return builder.Build();
}
}
推荐阅读
- mysql - 有什么方法可以使用 JOIN 正确替换条件子查询并优化这些类型查询?
- css - 移动子菜单的自定义样式
- asp.net-core - 网络核心单元测试中的http类型客户端
- java - 字符串在 Dagger 中被多次绑定
- html - 从侧面切割的打印预览
- azure-sqldw - 如何将下一行开始日期添加为上一行结束日期?
- java - Groovy 脚本错误:java.io.NotSerializableException:com.xlson.groovycsv.CsvIterator
- ravendb - RavenDB 4+ 分页查询,字段不同
- r - 在 R 中,这个括号 `[` 是什么?
- php - Laravel:使用外键从表中获取数据