使用ASP.NET Core DI解决实例

如何使用ASP.NET Core MVC内置的依赖项注入框架手动解析类型?

设置容器非常简单:

public void ConfigureServices(IServiceCollection services)

{

// ...

services.AddTransient<ISomeService, SomeConcreteService>();

}

但是,ISomeService不进行注射怎么办?例如,我要这样做:

ISomeService service = services.Resolve<ISomeService>();

中没有此类方法IServiceCollection

回答:

IServiceCollection接口用于

构建 依赖项注入容器。完全构建后,它将组成一个IServiceProvider实例,您可以使用该实例来解析服务。您可以将注入IServiceProvider到任何类中。的IApplicationBuilderHttpContext类可以提供所述服务提供商以及经由其ApplicationServicesRequestServices分别性质。

IServiceProvider定义一种GetService(Type type)解决服务的方法:

var service = (IFooService)serviceProvider.GetService(typeof(IFooService));

还有一些便利的扩展方法可用,如serviceProvider.GetService<IFooService>()(添加usingMicrosoft.Extensions.DependencyInjection)。

回答:

注入依赖

运行时的托管服务提供程序可以将某些服务注入到Startup类的构造函数中,例如IConfiguration

IWebHostEnvironmentIHostingEnvironment在3.0之前的版本中)ILoggerFactoryIServiceProvider。请注意,后者是由托管层构建的实例,并且

ConfigureServices()方法不允许注入服务,它仅接受一个IServiceCollection参数。这是有道理的,因为ConfigureServices()您可以在其中注册应用程序所需的服务。但是,您可以在此处使用注入到启动程序构造函数中的服务,例如:

public Startup(IConfiguration configuration)

{

Configuration = configuration;

}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)

{

// Use Configuration here

}

ConfigureServices()然后,可以将注册的所有服务注入该Configure()方法;您可以在IApplicationBuilder参数后添加任意数量的服务:

public void ConfigureServices(IServiceCollection services)

{

services.AddScoped<IFooService>();

}

public void Configure(IApplicationBuilder app, IFooService fooService)

{

fooService.Bar();

}

手动解决依赖关系

如果您需要手动解决服务,你最好使用ApplicationServices提供了通过IApplicationBuilderConfigure()方法:

public void Configure(IApplicationBuilder app)

{

var serviceProvider = app.ApplicationServices;

var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();

}

可以IServiceProviderStartup类的构造函数中直接传递in ,但是如上所述,

,因此实用程序也受到限制:

public Startup(IServiceProvider serviceProvider)

{

var hostingEnv = serviceProvider.GetService<IWebHostEnvironment>();

}

如果必须使用该ConfigureServices()方法解析服务,则需要使用其他方法。你可以建立一个中间IServiceProviderIServiceCollection其中包含已注册的服务实例

public void ConfigureServices(IServiceCollection services)

{

services.AddSingleton<IFooService, FooService>();

// Build the intermediate service provider

var sp = services.BuildServiceProvider();

// This will succeed.

var fooService = sp.GetService<IFooService>();

// This will fail (return null), as IBarService hasn't been registered yet.

var barService = sp.GetService<IBarService>();

}

通常,您应该避免在ConfigureServices()方法内部解析服务,因为实际上这是您 配置

应用程序服务的地方。有时您只需要访问一个IOptions<MyOptions>实例。您可以通过将IConfiguration实例中的值绑定到的实例来实现此目的MyOptions(本质上是选项框架所做的事情):

public void ConfigureServices(IServiceCollection services)

{

var myOptions = new MyOptions();

Configuration.GetSection("SomeSection").Bind(myOptions);

}

手动解决服务(又称为服务定位器)通常被认为是反模式。尽管有其用例(用于框架和/或基础结构层),但应尽可能避免使用它。

以上是 使用ASP.NET Core DI解决实例 的全部内容, 来源链接: utcz.com/qa/402744.html

回到顶部