首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ConfigureServices中使用ASP.NET核心DI解析实例

在ConfigureServices中使用ASP.NET核心DI解析实例
EN

Stack Overflow用户
提问于 2015-09-08 21:53:47
回答 6查看 356.8K关注 0票数 452

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

设置容器非常简单:

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddTransient<ISomeService, SomeConcreteService>();
}

但是,如何在不执行注入的情况下解析ISomeService?例如,我想这样做:

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

IServiceCollection中没有这样的方法。

EN

回答 6

Stack Overflow用户

发布于 2015-09-08 22:15:17

手动解析实例涉及到使用IServiceProvider接口:

解析Startup.ConfigureServices中的依赖项

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IMyService, MyService>();

    var serviceProvider = services.BuildServiceProvider();
    var service = serviceProvider.GetService<IMyService>();
}

解析Startup.Configure中的依赖关系

public void Configure(
    IApplicationBuilder application,
    IServiceProvider serviceProvider)
{
    // By type.
    var service1 = (MyService)serviceProvider.GetService(typeof(MyService));

    // Using extension method.
    var service2 = serviceProvider.GetService<MyService>();

    // ...
}

在ASP.NET核心3中解决Startup.Configure中的依赖关系

public void Configure(
    IApplicationBuilder application,
    IWebHostEnvironment webHostEnvironment)
{
    application.ApplicationServices.GetService<MyService>();
}

使用运行时注入服务

一些类型可以作为方法参数注入:

public class Startup
{
    public Startup(
        IHostingEnvironment hostingEnvironment,
        ILoggerFactory loggerFactory)
    {
    }

    public void ConfigureServices(
        IServiceCollection services)
    {
    }

    public void Configure(
        IApplicationBuilder application,
        IHostingEnvironment hostingEnvironment,
        IServiceProvider serviceProvider,
        ILoggerFactory loggerfactory,
        IApplicationLifetime applicationLifetime)
    {
    }
}

解析控制器操作中的依赖关系

[HttpGet("/some-action")]
public string SomeAction([FromServices] IMyService myService) => "Hello";
票数 169
EN

Stack Overflow用户

发布于 2019-04-15 04:49:41

如果您只需要解析一个依赖项,以便将其传递给您正在注册的另一个依赖项的构造函数,则可以这样做。

假设您有一个接受字符串和ISomeService的服务。

public class AnotherService : IAnotherService
{
    public AnotherService(ISomeService someService, string serviceUrl)
    {
        ...
    }
}

当你要在Startup.cs中注册它时,你需要这样做:

services.AddScoped<IAnotherService>(ctx => 
      new AnotherService(ctx.GetService<ISomeService>(), "https://someservice.com/")
);
票数 16
EN

Stack Overflow用户

发布于 2019-04-04 18:56:11

您可以通过以下方式在AuthorizeAttribute等属性中注入依赖项

var someservice = (ISomeService)context.HttpContext.RequestServices.GetService(typeof(ISomeService));
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32459670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档