Microsoft依赖项注入文档

时间:2018-10-10 15:20:07

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

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

  

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

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

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或将东西拉入您可能希望分开的结构中。使用定义的接口创建新类时,如何使控制台应用程序查看提供程序?

1 个答案:

答案 0 :(得分:3)

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

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

IServiceProvider serviceProvider = services.BuildServiceProvider();

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

example.SampleUse();

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

在检查框架DI集成时,在启动过程中,它在后台执行的操作完全相同。

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

引用ToolStripMenuItem

  

默认服务容器替换

     

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

     
      
  • 财产注入
  •   
  • 基于名称的注射
  •   
  • 子容器
  •   
  • 自定义生命周期管理
  •   
  • Func<T>支持延迟初始化
  •