ASP.NET Core 自动解析所有依赖

Vad*_*aev 2 asp.net-core

是否可以配置 ASP.NET Core DI 来解析所有类?类似于 Autofac AnyConcreteTypeNotAlreadyRegisteredSource 功能的东西。

我可以在 ASP.NET Core 中使用 Autofac,但我不想在我的应用程序中添加额外的库,因为 ASP.NET Core 已经有 DI。

所以基本上而不是:

services.AddTransient<MyService>();
services.AddTransient<MyAnotherService>();
Run Code Online (Sandbox Code Playgroud)

我更愿意做这样的事情:

services.ResolveAll();
Run Code Online (Sandbox Code Playgroud)

Bee*_*eej 8

似乎我们可以稍微反思一下这个通用的自动注入概念

我已经过滤了“Provider”命名空间,并寻找与没有“I”的接口拼写相同的类名,但当然要根据你自己的口味来调味

(此代码在 asp.net core 2.0 上下文下工作)

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

  foreach(var intfc in allProviderTypes.Where(t=>t.IsInterface)) {
    var impl = allProviderTypes.FirstOrDefault(c=>c.IsClass && intfc.Name.Substring(1) == c.Name);
    if (impl != null) services.AddScoped(intfc, impl);
  }
Run Code Online (Sandbox Code Playgroud)

  • 也许类似于: var impl = allProviderTypes.FirstOrDefault(c=&gt;c.IsClass &amp;&amp; intfc.IsAssignableFrom(c) &amp;&amp; !c.IsAbstract); 比假设命名约定要脆弱得多。 (2认同)

小智 6

也许 Scrutor(扫描功能)很接近您正在寻找的东西。 https://github.com/khellang/Scrutor


Set*_*Set 4

ASP.NET Core DI 不支持自动发现和自动注册,并且没有计划添加这些功能(至少在近功能中)。

主要原因是.NET Core 团队试图使内置容器尽可能简单,并为添加其他 DI 容器节省简单/直接的方法。

相关SO问题:Property Injection in Asp.Net Core