首页 > Web开发 > 详细

Asp.Net Core 减少Controller获取重复注入对象

时间:2019-05-31 01:11:07      阅读:294      评论:0      收藏:0      [点我收藏+]
原文:Asp.Net Core 减少Controller获取重复注入对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012770274/article/details/80876054

? ? 在使用Asp.Net Core的时候我们都会用到依赖注入获取自定义的服务,如果是仓储的话可能还好,不同的controller需要用到不同的仓储,通过构造函数注入也算明确了业务关系。可是在使用到日志服务,缓存服务等工具类服务的时候往往会发现在大多数的controller中都要通过构造函数获取一遍注入服务,是件很麻烦的事。现在的想法是通过创建继承自Controller的BaseController类,在BaseController获取到所有的服务,之后其他controller再继承自BaseController获取到这些服务。下面来看下实现方式。

使用的是.net core 2.1。

在Startup的ConfigureServices添加HttpContextAccessor服务

services.AddHttpContextAccessor();

创建自定义的服务和接口

public interface IMyService
{
    string GetGuId();
}
public class MyService : IMyService
{
    private string guid = Guid.NewGuid().ToString();

    public string GetGuId()
    {
        return guid;
    }
}

在Startup的ConfigureServices中注册自定义服务

//services.AddSingleton<IMyService, MyService>();
//services.AddTransient<IMyService, MyService>();
services.AddScoped<IMyService, MyService>();

定义静态类ServiceLocator

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

在Startup的Configure为ServiceLocator.Instance赋值

ServiceLocator.Instance = app.ApplicationServices;

在BaseController的构造方法里通过ServiceLocator.Instance获取IHttpContextAccessor,再使用IHttpContextAccessor获取注册的自定义服务。这里不直接使用ServiceLocator.Instance.GetService方法获取自定义服务是,因为如果使用Scoped方式注册服务的话这里获取服务会报错。

public class BaseController : Controller
{
    protected IMyService _myService;
    public BaseController()
    {
        var hca = ServiceLocator.Instance.GetService<IHttpContextAccessor>();
        _myService = hca.HttpContext.RequestServices.GetService<IMyService>();
    }
}

让自定义的Controller继承自BaseController,通过BaseController获取自定义服务

public IActionResult GetGuId()
{
    return Content(_myService.GetGuId());
}

这里特别感谢 田园里的蟋蟀 的《ASP.NET Core DI 手动获取注入对象》

Asp.Net Core 减少Controller获取重复注入对象

原文:https://www.cnblogs.com/lonelyxmas/p/10952999.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!