? ? 在使用 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 手动获取注入对象》
来源: http://www.bubuko.com/infodetail-3077403.html