• Core篇——初探依赖注入


    目录

    1、DI&&IOC简单介绍

    2、UML类图中六种关联关系

    3、.net core 中DI的使用

    4、.net core DI初始化源码初窥

    DI&&IOC简单介绍

      DI(依赖注入)是实现IOC(控制反转)的一种方式。面向对象设计六大基本原则的依赖倒置原则,高层类不应该依赖于低层类的实现 ,而应该依赖于它的抽象。所以我们现在工作中,经常是构造函数中,注入需要实现的类的接口;IOC描述的是当一个类需要另外一个类时,这个类的实现不应该由它来决定,实现由一个DI容器来实现,并将其注入到这个类中。

    UML类图中六种关联关系

      顺便复习一波UML类图中的六种关系:

    .net core 中DI的使用

      .NET Core框架中,默认存在一个DI容器,使用的时候我们只需要将需要将接口服务放入DI容器。 这里,我们创建一个Movie类,引用efcore 添加一个数据库链接上下文。添加一个IMovieService 接口和MovieService 类。代码如下所示

      

        public class ApplicationDbContext:DbContext
        {
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                :base(options)
            {
    
            }
            public DbSet<Movie> Movie { get; set; }
            
        }
    数据库链接上下文
     1     public class Startup
     2     {
     3         public IConfiguration Configuration { get; set; }
     4 
     5         public Startup()
     6         {
     7             var builder = new ConfigurationBuilder()
     8                 .AddJsonFile("appsettings.json");    //将appsettings 配置文件读入系统配置
     9 
    10             Configuration = builder.Build();
    11         }
    12         // This method gets called by the runtime. Use this method to add services to the container.
    13         // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    14         public void ConfigureServices(IServiceCollection services)
    15         {
    16             services.AddDbContext<ApplicationDbContext>(options =>
    17             {
    18                 options.UseSqlServer(Configuration.GetConnectionString("MVCMovieContext")); //添加数据库链接字符串
    19             });
    20             services.AddRouting();
    21             services.AddMvc();
    22             services.AddScoped<IMovieService, MovieService>();//接口服务放入DI容器
    23         }
    24 
    25         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    26         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    27         {
    28             if (env.IsDevelopment())
    29             {
    30                 app.UseDeveloperExceptionPage();
    31             }
    32             app.UseMvc(routes =>
    33             {
    34                 routes.MapRoute(
    35                     name: "default",
    36                     template: "{controller=Home}/{action=Index}/{id?}");
    37             });
    38         }
    39     }
    Startup类
    1     public class Movie
    2     {
    3         public int ID { get; set; }
    4         public string Title { get; set; }
    5         public DateTime ReleaseDate { get; set; }
    6         public string Genre { get; set; }
    7         public decimal Price { get; set; }
    8     }
    Movie类
     1     public interface IMovieService
     2     {
     3         Movie GetMovie(int Id);
     4     }
     5     public class MovieService : IMovieService
     6     {
     7         private readonly ApplicationDbContext _applicationDbContext;
     8 
     9         public MovieService(ApplicationDbContext applicationDbContext)
    10         {
    11             _applicationDbContext = applicationDbContext;
    12         }
    13         public Movie GetMovie(int Id)
    14         {
    15             var entity = _applicationDbContext.Movie.FirstOrDefault(t => t.ID == Id);
    16             if (entity == null)
    17                 return null;
    18             return entity;
    19         }
    20     }
    接口以及服务
     1     public class HomeController : Controller
     2     {
     3         private readonly IMovieService _movieService;
     4         public HomeController(IMovieService movieService)
     5         {
     6             _movieService = movieService;
     7         }
     8         public IActionResult Index(int Id)
     9         {
    10             var movie = _movieService.GetMovie(Id);
    11             return View(movie);
    12         }
    13     }
    Home控制器代码

       

    这里我们在MovieService中,注入了数据库链接上下文实例;在HomeController 中,注入了IMovieService 。

    .net core DI初始化源码初窥

      在 .Net Core 框架的Main函数中,

      1、WebHost 通过CreateDefaultBuilder 创建一个WebHostBuilder实例。WebHostBuilder调用 Build方法,在Build方法中,调用BuildCommonServices方法返回一个IServiceCollection。这个ServiceCollection是在BuildCommonServices方法中,实例化的一个,然后在实例化的ServiceCollection中加入一些默认的配置(例如HttpContextFactory,IHostingEnvironment)。

    拿到IServiceCollection对象后,在Build方法中,对IServiceCollection IServiceCollectionIServiceCollection.ServiceProvider 进行一个初始化操作(Initialize)方法,然后返回WebHost。

      2、在Initialize方法中,执行EnsureApplicationServices方法,EnsureApplicationServices中又通过调用EnsureStartup方法,在EnsureStartup中,通过WebHostProvider拿到StartUp实例。EnsureApplicationServices拿到StartUp后调用ConfigureServices方法,参数是ServiceCollection来完成DI。(这也就是我们新建一个项目StartUp 中的ConfigureServices方法,然后各种services.addxxxx(),把接口和服务放入到IserviceCollection)

    Jesse博客学习笔记。传送门=》 http://video.jessetalk.cn/

  • 相关阅读:
    为什么我用Ipad Pro做电子笔记和看PDF电子书
    将Chrome浏览器中的扩展程序导出为crx插件文件
    OneNote
    UPAD for iCloud
    在家和图书馆学习哪个好
    基于GRPC+consul通信的服务化框架(转)
    wrk中的lua脚本(转)
    Lua标准库(转)
    分布式队列编程:从模型、实战到优化(转)
    性能测试之-wrk(转)
  • 原文地址:https://www.cnblogs.com/liumengchen-boke/p/8206535.html
Copyright © 2020-2023  润新知