ASP.NET Core DI 手动获取注入对象

简介:

ASP.NET Core DI 一般使用构造函数注入获取对象,比如在ConfigureServices配置注入后,通过下面方式获取:

private IValueService _valueService;

public ValueController(IValueService valueService)
{
    _valueService = valueService;
}

那如果手动获取注入对象呢?

第一种获取方式(有时会获取不到,不推荐使用):

var services = new ServiceCollection();
var provider = services.BuildServiceProvider();

var _valueService = provider.GetService<IValueService>();

第二种获取方式(推荐使用):

public void Configure(IApplicationBuilder app)
{
    ServiceLocator.Instance = app.ApplicationServices;
}

public static class ServiceLocator
{
    public static IServiceProvider Instance { get; set; }
}


public void SomeRandomMethod()
{
    var valueService = ServiceLocator.Instance.GetService<IValueService>();

    // Do something with service
}

补充:需要注意的是,使用ServiceLocator.Instance.GetService<T>();,只能获取AddTransientAddSingleton注入的对象,而不能获取AddScoped(请求生命周期内唯一)注入的对象,不是不能获取,而是获取的和构造函数获取的不是相同对象,也就是说获取的对象没有共享,使用场景比如IUnitOfWork

那怎么手动获取请求生命周期内的注入对象呢?方法如下:

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace Sample.Domain
{
    public class SampleDomainService : IDomainService
    {
        private IUnitOfWork _unitOfWork;

        public SampleDomainService(IHttpContextAccessor httpContextAccessor)
        {
            _unitOfWork = httpContextAccessor.HttpContext.RequestServices.GetService<IUnitOfWork>();
        }
    }
}

IHttpContextAccessor接口在Microsoft.AspNetCore.Http.AbstractionsNuget 程序包下。





本文转自田园里的蟋蟀博客园博客,原文链接:http://www.cnblogs.com/xishuai/p/asp-net-core-ioc-di-get-service.html,如需转载请自行联系原作者

相关文章
|
20天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
30 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
2天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
16 5
|
10天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
19 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
前端开发 .NET Linux
|
前端开发 .NET Linux
【翻译】Asp.net Core介绍
ASP.NET Core is a significant redesign of ASP.NET. This topic introduces the new concepts in ASP.NET Core and explains how they help you develop modern web apps. Asp.net Core是重新设计过得新一代Asp.Net。
1189 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
45 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
54 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?