Autofac汇编扫描 - .NET Core

问题描述 投票:1回答:1

我一直试图在我的.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项目中不可能做到这一点?

如果有人能给我一个正确的方向,如何解决我的问题,那就太好了。

c# inversion-of-control autofac
1个回答
0
投票

有一个类似的问题,并通过添加以下内容来解决 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();
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.