如何使用ASP.NET核心MVC内置依赖注入框架手动解析类型?
设置容器非常简单:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddTransient<ISomeService, SomeConcreteService>();
}
但是,如何在不执行注入的情况下解析ISomeService
?例如,我想这样做:
ISomeService service = services.Resolve<ISomeService>();
IServiceCollection
中没有这样的方法。
发布于 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";
发布于 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/")
);
发布于 2019-04-04 18:56:11
您可以通过以下方式在AuthorizeAttribute等属性中注入依赖项
var someservice = (ISomeService)context.HttpContext.RequestServices.GetService(typeof(ISomeService));
https://stackoverflow.com/questions/32459670
复制相似问题