【问题标题】:Microsoft Dependency Injection DocumentationMicrosoft 依赖注入文档
【发布时间】:2018-10-10 23:45:38
【问题描述】:

在依赖注入的文档中,我注意到以下行。

MVC 框架会自动查看服务提供者以 在 Controller 中注册我们的依赖。

然后他们提供了一个构造函数注入的基本示例,不是他们的示例,而是本质上的 this。

public class Example
{
     private IFooFactory foo;

     public Example(IFooFactory foo) => this.foo = foo;

     public void SampleUse()
     {
          using(var context = foo.Create())
              context.DoSomething();
     }
}

如果你有一个控制台应用程序,默认情况下它不会查看服务提供者来注册你对具体实现的依赖。有没有办法模拟呢?否则,控制台应用程序将要求您执行以下操作:

public static Main(string[] args)
{
    // Stuff to prepare the application and build service provider.
    var service = serviceProvider.GetService<IFooFactory>();
    using(var context = service.Create())
        context.DoSomething();

    // OR

    var fooFactory = serviceProvider.GetService<IFooFactory>();
    new Example(fooFactory).SampleUse();
}

这会产生必须传递IFooFactory 或将您可能希望为结构分开的主要内容的问题。当使用定义的接口创建新类时,如何让控制台应用程序查看提供程序?

【问题讨论】:

  • 您也许可以使用Scrutor 来帮助解决这个问题。我自己没有使用过它,但我最近看到它出现了几次。将它与ActivatorUtilities.CreateInstance 结合起来可能会让您满意。
  • @KirkLarkin 我会去看看。
  • 看看Composition Root的概念。您的 Main 方法是应用程序的 Composition Root,这是注册和解析的地方。
  • @Steven 谢谢,我去看看。总是渴望学习,所以感激不尽。

标签: c# dependency-injection .net-core


【解决方案1】:

您必须手动创建所有内容,因为框架无法自动为您完成。

var services = new ServiceCollection();
services.AddTransient<IFooFactory, FooFactory>();
services.AddTransient<Example>();

IServiceProvider serviceProvider = services.BuildServiceProvider();

Example example = serviceProvider.GetService<Example>();

example.SampleUse();

虽然并不理想,但通常是手动配置 DI 的大多数示例中显示的方式。

当您检查框架 DI 集成时,它在启动期间在后台执行完全相同的操作。

您可能可以编写自己的代码来检查可用类型,但这是一项非常广泛的任务,需要您自己解决。

参考Dependency injection in ASP.NET Core

默认服务容器更换

内置服务容器旨在满足用户的需求 框架和大多数消费者应用程序。我们建议使用内置 容器,除非您需要它不支持的特定功能。 3rd 方容器支持的某些功能在 内置容器:

  • 属性注入
  • 基于名称的注入
  • 儿童容器
  • 自定义生命周期管理
  • Func&lt;T&gt; 支持延迟初始化

【讨论】:

  • 没错,但这是理想的方式吗?
  • “您可能会编写自己的代码来检查可用类型”,但这似乎应该内置在核心中。不仅是他们的 Web 框架,还有控制台应用程序,以及任何其他利用核心的应用程序。
  • @Greg 内核中的内置 DI 是一个满足基本要求的小模块。自动发现和注册是高级功能。这也是为什么 MVC 框架还允许您将内置 DI 替换为您选择的第 3 方 DI。
  • 太糟糕了,因为在大多数情况下,这似乎是一个非常有价值的功能。他们在 Unity 中有它,但是很好。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 2016-09-28
  • 2022-01-11
  • 2023-03-17
  • 2011-04-08
  • 2014-06-12
相关资源
最近更新 更多