在依赖项注入文档中,我注意到以下行。
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
或将东西拉入您可能希望分开的结构中。使用定义的接口创建新类时,如何使控制台应用程序查看提供程序?
答案 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集成时,在启动过程中,它在后台执行的操作完全相同。
您可能可以编写自己的代码来检查可用的类型,但这是一个非常艰巨的任务,需要您自己解决。
默认服务容器替换
内置服务容器旨在满足用户的需求 框架和大多数消费者应用。我们建议使用内置 容器,除非您需要它不支持的特定功能。 第3方容器中支持的某些功能未在 内置容器:
- 财产注入
- 基于名称的注射
- 子容器
- 自定义生命周期管理
Func<T>
支持延迟初始化