.NET学习笔记之默认依赖注入

.net学习笔记之默认依赖注入

介绍

不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽象。简单的说就是为了更好的解耦。而控制反转(ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖注入(di)。asp.net core内置有对依赖注入(di)的支持,开发者只需要定义好接口后,在startup.cs的configureservices方法里使用对应生命周期的绑定方法即可。

只要是用new实例化的都是存在依赖的。

生命周期

addsingleton→addtransient→addscoped

singleton(单例)

服务在第一次请求时被创建(或者当我们在configureservices中指定创建某一实例并运行方法),其后的每次请求将沿用已创建服务。如果开发者的应用需要单例服务情景,请设计成允许服务容器来对服务生命周期进行操作,而不是手动实现单例设计模式然后由开发者在自定义类中进行操作。

services.addsingleton<iapplicationservice,applicationservice>

比如某些公共类等

scoped(作用域)

一次请求开始到请求结束 ,这次请求中获取的对象都是同一个

services.addscoped<iapplicationservice,applicationservice>

如果该service在一个请求过程中多次被用到,并且可能共享其中的字段或者属性,那么就使用scoped,例如httpcontext (感谢群里老哥的帮助)

transient(瞬时)

每一次获取的对象都不是同一个,它最好被用于轻量级无状态服务(如我们的repository和applicationservice服务)

services.addtransient<iapplicationservice,applicationservice>

如果该service在一次请求中只使用一次,那么就注册transient就好了。

注入方式

  /// <summary>
  /// 用户接口
  /// </summary>
  public interface iuserservice
  {
      string getname();
  }

  /// <summary>
  /// 用户实现
  /// </summary>
  public class userservice : iuserservice
  {
      public string getname()
      {
          return "azrng";
      }
  }

需要在configureservices方法进行注入

构造函数注入

服务作为构造函数参数添加,并且运行时从服务容器中解析服务。

      private readonly iuserservice _userservice;

      public usercontroller(iuserservice userservice)
      {
          _userservice = userservice;
      }

      [httpget]
      public actionresult getname()
      {
          return ok(_userservice.getname());
      }
fromservices操作注入
      [httpget]
      public actionresult getname([fromservices] iuserservice _userservice)
      {
          return ok(_userservice.getname());
      }

核心

在.net core中di的核心分为两个组件:iservicecollection和 iserviceprovider。

  • iservicecollection负责注册
  • iserviceprovider负责提供实例
public void configureservices(iservicecollection services)
{
  //将服务生命期的范围限定为单个请求的生命期
  services.addtransient<iuserservice, userservice>();
}

获取服务

      private readonly iuserservice _userservice;
      public homecontroller(iuserservice userservice)
      {
          _userservice = userservice;
      }

      public iactionresult index()
      {
          var info = _userservice.getinfo();
          return view();
      }

iserviceprovider获取

      private readonly iserviceprovider _service;
      public usercontroller(iserviceprovider service)
      {
          _service = service;
      }

      [httpget]
      public actionresult getname()
      {
          var _userservice = (iuserservice)_service.getservice(typeof(iuserservice));
          return ok(_userservice.getname());
      }

statrup中获取服务

var provider = services.buildserviceprovider();
var userserivce = provider.getservice<iuserservice>();
//或
var userservice2 = provider.getrequiredservice<iuserservice>();

总结

关于.net学习笔记之默认依赖注入的文章就介绍至此,更多相关.net默认依赖注入内容请搜索硕编程以前的文章,希望大家多多支持硕编程

下一节:asp.net基础知识扫盲篇

asp.net编程技术

相关文章