【问题标题】:Resolve all dependencies of the project in .net core解决.net core中项目的所有依赖
【发布时间】:2018-08-13 08:42:42
【问题描述】:

我想解决我项目中的所有依赖项。我的项目由 Web、Service 和 DataAccess 3 层组成。

我之前在使用 AutoFac 时做过这个:

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(x => x.FullName.Contains("OrderForm")).ToArray();
            builder.RegisterAssemblyTypes(assemblies)
                .AsImplementedInterfaces()
                .InstancePerRequest();

现在我想在 .net 核心中做同样的事情。我试过这个:

var allProviderTypes = System.Reflection.Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace != null && t.Namespace.Contains("Providers"));

问题是这只会返回 web-assembly 而不是其他的。

【问题讨论】:

  • 您仍然可以将 AutoFac 与 (ASP).NET Core 的 IServiceCollection/IServiceProvider 一起使用。 .NET Core DI/IoC 容器旨在简单,缺乏更高级的功能。这是一个良好的开端,ASP.NET Core 被设计为可扩展的,包括第 3 方 IoC 容器的插件:docs.autofac.org/en/latest/integration/aspnetcore.html
  • @Tseng:但是我如何获得所有的程序集呢?我不能在 .net core 中使用 BuildManager?
  • 如果它使用 .GetEntryAssembly().GetReferencedAssemblies()AppDomain.GetAssemblies()(请参阅 GitHub issue),它应该可以工作,这在较新的 .NET Core/Standard 版本中可用
  • 您确定 t.Namespace.Contains("Providers") 吗?

标签: c# asp.net-core .net-core


【解决方案1】:

在您的 Startup.cs 中的 ConfigureServices 方法中

  var container = new ContainerBuilder();
        container.Populate(services);

        return new AutofacServiceProvider(container.Build());

【讨论】:

  • 我的前辈在我们的项目中写了,所以他可以解释一下。但它工作正常。你可以使用它。
  • rof。它在 ConfigureServices 中创建 AutoFac 容器,并将其包装在 IServiceProvider 的实现周围,然后从 ConfigureServices 方法返回。然后 ASP.NET Core 使用此提供程序而不是自己创建一个提供程序(这将是默认的 .NET Core IoC 容器(又名ServiceProvider
  • @Bryan 默认情况下,您仍然必须使用 autofac 的自动扫描功能才能这样做。只有显式注册(通过方法或程序集扫描)的类才被注册并且可以被解析。 AppDomain.GetAssemblies() 应该为您提供所有已加载的程序集(仅限 .NET Core 2.0 及更高版本)
  • @WaqasDilawarDaha: 使用上面的代码,只有在services中注册的那个(通过ConfigureServices中的.AddXxx方法
  • @Tseng 好吧,亲爱的,我已经开始自己探索 AutoFac。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2017-08-16
  • 2016-11-26
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多